【问题标题】:Can I specify a constructor value using the = operator?我可以使用 = 运算符指定构造函数值吗?
【发布时间】:2018-05-04 11:26:08
【问题描述】:

在 C# 中创建字符串时,您会将 string foo = "bar"; 字符串作为一个类,然后使用 = 运算符将值“bar”传递给该类。那是怎么做的?你能在自己的课堂上这样做吗?

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

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

};

int main() {
    someClass classInst = 123;
}

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

【问题讨论】:

    标签: c# constructor operators


    【解决方案1】:

    这个问题有两个部分:

    • 字符串字面量的工作原理
    • 如何为自己的班级做同样的事情

    字符串字面量

    表达式"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);
    

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

    【讨论】:

      【解决方案2】:

      您可以定义两种类型之间的隐式转换: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

      【讨论】:

        猜你喜欢
        • 2020-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-20
        • 2010-12-19
        • 2017-10-06
        • 2011-03-13
        • 2020-05-19
        相关资源
        最近更新 更多