Определение класса типа значения в C#?
Можно ли создать класс, который не является структурой, но является типом значения или похож на тип значения в том смысле, что он копируется при передаче, а не по ссылке.
редактировать:
Извините за вопрос, который нужно отредактировать после того, как его спросили.
Также см. Этот вопрос для получения дополнительной информации. Цикл в структуре структуры, которая не существует
4 ответа
РЕДАКТИРОВАТЬ 2
Как теперь кажется, вы хотите объявить тип истинного значения, используя class
ключевое слово, которое по определению невозможно.
Поскольку вы смотрите на создание класса с семантикой, аналогичной System.String, вам, вероятно, следует декомпилировать System.String. Большая часть его магии скрыта в CLR, но многое из того, что вы увидите, поможет.
Для начала вам обязательно нужно перегрузить ==
а также !=
и переопределить Equals()
а также GetHashCode()
, Вы почти наверняка захотите реализовать IComparable<T>
а также IEquatable<T>
также.
Другим важным аспектом строк является то, что они неизменны. Это важная часть их поведения, подобного значению, поскольку оно гарантирует, что две одинаковые строки всегда будут равны. Если бы строки были изменяемыми, было бы возможно изменить одну из строк, чтобы сделать ее неравной другой.
Я также должен отметить, что, хотя у строки есть семантика, которая делает ее похожей на тип значения, это, конечно, ссылочный тип, и некоторые аспекты ссылочной семантики неизбежны.
Если вы опубликуете немного больше о том, почему вы хотите это сделать, мы можем предложить более конкретный совет.
РЕДАКТИРОВАТЬ
В ответ на ваши изменения кажется, что у вас неправильное представление о строках. Хотя они ведут себя как типы значений в некоторых отношениях, они не передаются напрямую путем копирования своих данных при каждой передаче в метод. Единственный способ добиться этого - объявить struct
, Строки, как и все классы, являются ссылочными типами, доступ к которым возможен только по ссылке; вы можете только манипулировать ссылкой напрямую; Вы можете только передать ссылку на метод.
Можно разработать класс, который имитирует почти неизменную семантику значений. System.String
попадает в эту категорию. Для данного экземпляра класса единственный способ получить экземпляр, который подобен первому, но в чем-то отличается, - это создать новый экземпляр на основе оригинала. Чтобы достичь "почти неизменной семантики значений", класс должен переопределить Object.Equals()
а также Object.GetHashCode()
таким образом, что два экземпляра, которые содержат идентичные данные, будут сравниваться равными друг другу и давать один и тот же хэш-код.
Для классов, имитирующих семантику изменяемых значений, должно быть средство указания того, что копирование поля этого типа класса должно также копировать объект, на который они ссылаются (и если этот процесс требует копирования любых аналогично объявленных полей из этого объекта, объекты, на которые ссылаются эти поля, также должны быть скопированы и т. д.) Существуют способы добавления поддержки для этого в CLR, но в настоящее время такой возможности не существует.
public struct Example
{
public int Property {get;set;}
}
Или что вы имели в виду, когда просили привести пример?
Хотя ValueType является неявным базовым классом для типов значений, вы не можете создать класс, который наследуется непосредственно от ValueType. Вместо этого отдельные компиляторы предоставляют ключевое слово или конструкцию языка (например, struct в C# и Structure…End Structure в Visual Basic) для поддержки создания типов значений.
источник: http://msdn.microsoft.com/en-us/library/system.valuetype.aspx