C#中的自定义原语?

C#中的自定义原语?,c#,primitive,C#,Primitive,除了这一点值得怀疑的有用性之外,我想问一下,是否有可能按照这些思路做些事情 class MyPrimitive { String value; public String Value { get { return value; } set { this.value = value; } } } // Instead of doing this... MyPrimitive a = new MyPri

除了这一点值得怀疑的有用性之外,我想问一下,是否有可能按照这些思路做些事情

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;
    }
}
编辑:使结构不可变,因为Marc Gravell完全正确。

可以使用隐式转换。不建议这样做,但:

public static implicit operator string(MyString a) {
    return a.Value;
}
public static implicit operator MyString(string a) {
    return new MyString { value = a; }
}

同样,这是一种糟糕的做法。

这正是提问者所寻求的。它并不完全是一个“自定义原语”,但它尽可能地模仿了一个,并且是C#的正确方式;在结构上有一个{get;set;}是一个非常非常糟糕的主意。我提到过不好的地方吗?完全同意,抱歉搞混了。我本来是错误地试图尽可能地模仿他的榜样;我会给它一个+1的调整-P不确定这总是“坏习惯”。依我看,这取决于上下文。在引用类型上使用转换运算符隐藏了新对象的实例化;更糟糕的是,返回一个旧的引用,对于可变类型(而不是字符串),该引用只会导致问题。对我来说,最好只在值类型上使用转换运算符,并将引用类型留给向上和向下转换。