我可以使用 = 运算符指定构造函数值吗?

Can I specify a constructor value using the = operator?

在 C# 中创建字符串时,您会将 string foo = "bar"; 字符串作为 class,并且值 "bar" 使用 = 运算符。那是怎么做到的?你能自己做吗class?

我知道这在 C++ 中是可行的。

class someClass {
public:
    someClass(int someInt) {
        // Do Stuff
    }

};

int main() {
    someClass classInst = 123;
}

但是 C# 的等价物是什么?

这个问题分为两部分:

  • 字符串文字的工作原理
  • 如何为自己做同样的事情class

字符串文字

表达式 "bar" 已经是 string 类型的值。这里的赋值运算符只是复制引用,就像它对其他任何东西所做的那样。字符串文字会导致在可能的情况下创建字符串对象(但会重复使用,因此如果您在循环中使用该代码,则只有一个 string 对象)。 FormattableString 周围的内插字符串文字有一些微妙之处,但出于这个问题的目的,我将忽略它。


创建您自己的类似文字的语法

你不能让赋值运算符直接隐式调用构造函数,不。您 可以 添加从 intSomeClass 的隐式转换,但我通常不鼓励这样做。

如果您真的想要这样做,这是一个完整的示例,但它确实不是惯用的。当你有隐式转换时,你就更难推理重载决议了,例如 - 任何阅读你代码的人都必须知道 用户定义的隐式转换。

using System;

class SomeClass
{
    public int Value { get; }

    public SomeClass(int value) => Value = value;

    public static implicit operator SomeClass(int value) =>
        new SomeClass(value);
}

public class Program
{
    static void Main()
    {
        SomeClass x = 123;
        Console.WriteLine(x.Value);
    }
}

请注意,如果 target-typed new 功能在 C# 8 中实现,您可以编写:

SomeClass x = new(123);

...所以你至少会在那里保存重复项,即使对于字段也是如此。

您可以定义两种类型之间的隐式转换:intSomeClass,如下所示:

// User-defined conversion from SomeClass to int
public static implicit operator int(SomeClass someClass)
{
    return someClass.SomeInt;
}
//  User-defined conversion from int to SomeClass
public static implicit operator SomeClass(int someInt)
{
    return new SomeClass(someInt);
}

这些方法应该在 SomeClass 声明中定义。

有关隐式转换的更多信息,请查看此 link