获取设置属性

时间:2013-07-23 13:05:30

标签: c# get set

所以我试着在C#上使用get / set属性,但我无法让我的代码工作(它崩溃我的控制台应用程序)

这是我的textHandler.cs文件,你可以看到public static void方法WriteInfo正在使用get / set属性但它崩溃了我的app ..

class TextHandler
{
    public static void WriteInfo(String text)
    {
        var consoleText = new Text();
        consoleText.text = text;
        Console.ForegroundColor = ConsoleColor.Cyan;
        Console.WriteLine(consoleText);
        Console.ForegroundColor = ConsoleColor.White;
    }
    public static void WriteError(String text)
    {
        Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine(text);
        Console.ForegroundColor = ConsoleColor.White;
    }
    public static void WriteSuccess(String text)
    {
        Console.ForegroundColor = ConsoleColor.Green;
        Console.WriteLine(text);
        Console.ForegroundColor = ConsoleColor.White;
    }
    public static void WriteText(String text, ConsoleColor color)
    {
    }
}
public class Text
{
    public String text
    {
        get
        {
            return this.text;
        }
        set
        {
            this.text = value;
        }
    }
}

我在这里称之为

TextHandler.WriteInfo("New client with version : " + message + " | current version : " + version);

如果我删除该行应用程序不再崩溃,不知道我做错了什么,因为我没有得到任何错误。 如果这是一个不好的方法,请告诉我,我想改进 感谢

4 个答案:

答案 0 :(得分:6)

创建无限递归的代码是:

public String text
    {
        get
        {
            return this.text;
        }
        set
        {
            this.text = value;
        }
    }

在设置中,您将this.text = value分配给自己,创建无限递归,所以StackOverflow很快或更晚。

似乎您不需要字段,因此请将代码更改为:

 public String Text {get;set} //PROPERTIES ARE UPPERCASE BY MS STANDART

答案 1 :(得分:4)

您需要将“支持”字段与公共属性分开:

public class Text
{
    private string text;

    public String TheText
    {
        get
        {
            return this.text;
        }
        set
        {
            this.text = value;
        }
    }
}

在上面的例子中,TheText是一个“命名不好”的公共属性,text是支持字段。目前,您的代码正在为两者寻址相同的字段,从而导致递归。通常,惯例是拥有大写属性Text和小写支持字段text

但是,在您的代码中,您已将该类命名为Text,因此难以解决text.Text

答案 2 :(得分:1)

无需创建“Text”类。只需将字符串传递给Console.WriteLine即可。此外,您没有指定应用程序的性质。这在控制台应用程序中可以正常工作,但可能不适用于Web应用程序或未绑定到SdtOut的其他应用程序

答案 3 :(得分:1)

所以, 您将设置为再次调用set方法的属性,直到获得StackOverflow异常。

为避免这种情况,请尝试使用

public class Text
{
    string _text = null;
    public String text
    {
        get
        {
            return this.text;
        }
        set
        {
            _text = value;
        }
    }
}

or empty get set methods

public class Text
{
    public  string text { get; set; }
}