【问题标题】: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 周围的插值字符串文字在这里有一些微妙之处,但出于本问题的目的,我将忽略这一点。
创建自己的类似文字的语法
你不能让赋值运算符直接隐式调用构造函数,不。您可以添加从int 到SomeClass 的隐式转换,但我通常不鼓励这样做。
这是一个完整的示例,以防您真的想要这样做,但这确实不是惯用的。当你有隐式转换时,你就更难推理重载决议了——任何阅读你的代码的人都必须知道有用户定义的隐式转换。
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】:
您可以定义两种类型之间的隐式转换:int 和 SomeClass,如下所示:
// 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。