Пользовательские примитивы в С#?
Помимо сомнительной полезности этого, я хотел бы спросить, возможно ли что-то сделать в этом направлении.
class MyPrimitive {
String value;
public String Value {
get { return value; }
set { this.value = value; }
}
}
// Instead of doing this...
MyPrimitive a = new MyPrimitive();
a.Value = "test";
String b = a.Value;
// Isn't there a way to do something like this?
MyPrimitive a = "test";
String b = a;
Мне нравится обертывать примитивные типы в пользовательские классы, используя свойство, чтобы сделать метод get
и set
выполнять другие действия, такие как проверка.
Поскольку я делаю это довольно часто, я думал, что было бы неплохо также иметь более простой синтаксис, например, для стандартных примитивов.
Тем не менее, я подозреваю, что это не только невозможно, но также может быть концептуально неправильным.
Любые идеи были бы очень желанными, спасибо.
Ответы
Ответ 1
Используйте тип значения (struct
) и дайте ему неявный оператор преобразования из нужного вам типа с правой стороны назначения.
struct MyPrimitive
{
private readonly string value;
public MyPrimitive(string value)
{
this.value = value;
}
public string Value { get { return value; } }
public static implicit operator MyPrimitive(string s)
{
return new MyPrimitive(s);
}
public static implicit operator string(MyPrimitive p)
{
return p.Value;
}
}
EDIT: сделана структура неизменной, потому что Марк Гравелл абсолютно прав.
Ответ 2
Вы можете использовать неявное литье. Это не рекомендуется, но:
public static implicit operator string(MyString a) {
return a.Value;
}
public static implicit operator MyString(string a) {
return new MyString { value = a; }
}
Опять же, плохая практика.