Определение типа значения класса в C #? - PullRequest
1 голос
/ 15 февраля 2012

Можно ли создать класс, который не является структурой, но является типом значения или похож на тип значения в том смысле, что он копируется при передаче вместо передачи по ссылке.

edit:

Извините за вопрос, который необходимо отредактировать после того, как его спросили.

Также см. Этот вопрос для получения дополнительной информации. Цикл в макете структуры, который не существует

Ответы [ 4 ]

6 голосов
/ 15 февраля 2012

РЕДАКТИРОВАТЬ 2

Как теперь кажется, вы хотите объявить тип истинного значения с помощью ключевого слова class, которое по определению невозможно.


Поскольку вы смотрите на создание класса с семантикой, аналогичной System.String, вам, вероятно, следует декомпилировать System.String.Большая часть его магии скрыта в CLR, но многое из того, что вы увидите, поможет.

Для начала вам определенно потребуется перегрузить == и != и переопределить Equals() и GetHashCode().Вы почти наверняка захотите реализовать IComparable<T> и IEquatable<T>.

Еще один важный аспект строк - это то, что они неизменны .Это важная часть их поведения, подобного значению, потому что оно гарантирует, что две одинаковые строки всегда будут равны.Если бы строки были изменяемыми, было бы возможно изменить одну из строк, чтобы сделать ее неравной для другой.

Я также должен отметить, что хотя строка имеет семантику, из-за которой она выглядит как тип значения, это, конечно, ссылочный тип , и некоторые аспекты семантики ссылок неизбежны.

Если вы опубликуете немного больше о том, почему вы хотите это сделать, мы можем предложить более конкретный совет.

РЕДАКТИРОВАТЬ

В ответ на ваши изменения, кажется, у вас неправильное представление о строках.Хотя они в некотором смысле ведут себя как типы значений, они не передаются напрямую, копируя свои данные каждый раз, когда они передаются методу. Единственный способ добиться этого - объявить struct.Строки, как и все классы, являются ссылочными типами, доступ к которым возможен только по ссылке;вы можете только манипулировать ссылкой напрямую;Вы можете только передать ссылку на метод.

3 голосов
/ 16 февраля 2012

Можно разработать класс, который имитирует неизменяемую семантику значений, почти.System.String попадает в эту категорию.Для данного экземпляра класса единственный способ получить экземпляр, который похож на первый, но отличается в некотором отношении, - это создать новый экземпляр на основе оригинала.Чтобы достичь «почти неизменной семантики значений», класс должен переопределить Object.Equals() и Object.GetHashCode() таким образом, чтобы два экземпляра, которые содержат идентичные данные, сравнивались друг с другом и давали один и тот же хэш-код.

Для классов, имитирующих семантику значения mutable , должно быть средство указания того, что копирование поля этого типа класса также должно копировать объект, на который они ссылаются (и если этот процесс требует копирования любого аналогично объявленногополя из этого объекта, объекты, на которые ссылаются эти поля, также должны быть скопированы и т. д.) Существуют способы добавления поддержки для этого в CLR, но в настоящее время такой возможности не существует.

1 голос
/ 15 февраля 2012

Хотя ValueType является неявным базовым классом для типов значений, вы не можете создать класс, который наследует непосредственно от ValueType. Вместо этого отдельные компиляторы предоставляют ключевое слово языка или конструкцию (например, struct в C # и Structure… End Structure в Visual Basic) для поддержки создания типов значений.

источник: http://msdn.microsoft.com/en-us/library/system.valuetype.aspx

1 голос
/ 15 февраля 2012
public struct Example
{
    public int Property {get;set;}
}

Или, что вы имели в виду, когда просили привести пример?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...