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

时间:2018-05-04 11:26:09

标签: c# constructor operators

在C#中创建一个字符串时,你要将string foo = "bar";字符串作为一个类,而值" bar"使用=运算符传递给类。怎么做的?你能在自己的班上做到这一点吗?

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

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

};

int main() {
    someClass classInst = 123;
}

但是C#会等同于什么?

2 个答案:

答案 0 :(得分:8)

这个问题分为两部分:

  • 字符串文字如何工作
  • 如何为自己的班级做同样的事情

字符串文字

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

请注意,如果C#8中传递了target-typed new功能,您就可以写下:

SomeClass x = new(123);

...所以你至少要在那里保存复制品,即使是田地。

答案 1 :(得分:1)

您可以在以下两种类型之间定义隐式转化:WebDriverWait wait = new WebDriverWait(driver, 30); WebElement e = driver.findElement(By.xpath(“//*[text()=’”+ “父母” +”’]”); wait.until(ExpectedConditions.elememtToBeClickable(e)); e.click(); 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); } 声明中定义。

有关隐式转换的详细信息,请检查此link