我可以使用 = 运算符指定构造函数值吗?
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
周围的内插字符串文字有一些微妙之处,但出于这个问题的目的,我将忽略它。
创建您自己的类似文字的语法
你不能让赋值运算符直接隐式调用构造函数,不。您 可以 添加从 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);
...所以你至少会在那里保存重复项,即使对于字段也是如此。
您可以定义两种类型之间的隐式转换: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。
在 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
周围的内插字符串文字有一些微妙之处,但出于这个问题的目的,我将忽略它。
创建您自己的类似文字的语法
你不能让赋值运算符直接隐式调用构造函数,不。您 可以 添加从 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);
...所以你至少会在那里保存重复项,即使对于字段也是如此。
您可以定义两种类型之间的隐式转换: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。