C#:引用时是否可以创建一个具有“默认属性”值的对象?

时间:2011-05-03 03:39:27

标签: c#-4.0

是否可以使用构造函数参数创建一个对象,该参数在引用时返回属性值,而不使用点表示法?以下是一些例子:

public class myObject
{
    public string myObject {get; private set;}
    public myObject( string tempstring)
    {
        this.myObject = tempstring.ToUpper();
    }
}

var a = new myObject("somevalue");
Console.WriteLine( myObject ); // outputs the string "SOMEVALUE"

这是另一次尝试:

public class myInt
{
    public int myInt {get; private set;}
    public myInt(string tempInt)
    {    this.myInt = Convert.ToInt32(tempInt);
    }
}

var a = new myInt("3");
var b = a + a;   // ends up being an int datatype value of 6

我知道我总能做var b = a.myInt + a.myInt。我想我可以使用静态函数创建一个静态类,每次将参数转换为结果,但它不会保持状态。

好奇。这将使我实际上试图做的事情变得更加困难。

2 个答案:

答案 0 :(得分:3)

在第一种情况下,是的。覆盖ToString方法。

public class myObject
{
    public string myValue {get; private set;}
    public myObject( string tempstring)
    {
        this.myValue = tempstring.ToUpper();
    }

    public override string ToString()
    {
        return myValue;
    }
}

在第二种情况下,有点像。您不应该尝试重载运算符以提供意外行为。创建一种方法来执行在读取代码时没有意义的行为。你建议的(返回一个int)肯定不会让我返回一个int(主要是因为var而不是严格定义的类型)。使用+运算符返回新的myInt对象有意义。使用+运算符返回int 不会。

您可以重载+运算符以返回新的myInt对象,然后还向int添加implicit强制转换。只要确保它有意义,并且它是可读的。

在课堂上,您可以使用:

public static implicit operator int(myInt m) 
{
    return myValue;
}

public static myInt operator +(myInt left, myInt right) 
{
    // requires constructor that takes int
    return new myInt(left.myValue + right.myValue);
}

当然,你可以走直接路线,但只有当它使它更具可读性而不是更少时才使用它(注意,就像方法操作符不能简单地通过返回类型重载,所以你必须在两个)。

public static int operator +(myInt left, myInt right) 
{
    return left.myValue + right.myValue;
}

答案 1 :(得分:2)