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

标签 c# constructor operators

在 C# 中创建字符串时,您会执行 string foo = "bar"; string 是一个类,并且使用 = 将值“bar”传递给该类 运算符。那是怎么做到的?你能在自己的类里面这样做吗?

我知道这在 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);

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

关于c# - 我可以使用 = 运算符指定构造函数值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50173810/

相关文章:

c# - 更新后 System.Reflection 多个程序集错误

c# - 重载运算符==后,如何比较两个变量是否指向同一个对象?

c# - XAML 停止列表框文本样式在散焦时更改

c# - 将 PLINQ 与异步方法相结合

c# - azure 上的 FFMpeg 函数无法处理同时调用(超过 5 个)

scala - 构造函数的按名称参数

c++ - 静态类数据成员和构造函数

php - 防止对象出现多个实例

c++ - 重载==函数没有被调用

c++ - 赋值或条件绑定(bind)更强吗?