Пользовательские примитивы в C #?
Вопрос
Помимо сомнительной полезности этого, я хотел бы спросить, возможно ли что-то сделать в этом направлении.
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
выполняли другие функции, например проверку.
Поскольку я делаю это довольно часто, я подумал, что было бы неплохо иметь более простой синтаксис, как для стандартных примитивов.
Тем не менее, я подозреваю, что это не только невозможно, но и может быть концептуально неправильным.
Любые идеи будут приветствоваться, спасибо.
Решение
Используйте тип значения ( 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;
}
}
РЕДАКТИРОВАТЬ: сделал структуру неизменной, потому что Марк Гравелл абсолютно прав.
Другие советы
Вы можете использовать неявное приведение . Это не рекомендуется, но:
public static implicit operator string(MyString a) {
return a.Value;
}
public static implicit operator MyString(string a) {
return new MyString { value = a; }
}
Опять плохая практика.