【问题标题】:Get set properties获取设置属性
【发布时间】:2013-07-23 13:05:29
【问题描述】:

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

这是我的 textHandler.cs 文件,您可以看到公共静态 void 方法 WriteInfo 正在使用 get/set 属性,但它使我的应用程序崩溃..

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);

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

【问题讨论】:

    标签: c# get set


    【解决方案1】:

    创建无限递归的代码是:

    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
    

    【讨论】:

    • 是的,OP 甚至不应该有这个类。为什么要创建一个只包含字符串的单独类?
    • 是的,你说的是工作,但我从来没有显示字符串文本,我只是得到“ServerApp.text”(serverApp 是命名空间)有什么想法吗?
    • 可能是属性名 文字不太好,可以改一下。在您的情况下,这样做可能就足够了: ServerApp.text t = new Server.App.text();文本.文本..
    【解决方案2】:

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

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

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

    但是,在您的代码中,您已将类命名为 Text,因此地址 text.Text 会造成混淆。

    【讨论】:

    • 是的,你说的是工作,但我从来没有显示字符串文本,我只是得到“ServerApp.text”(serverApp 是命名空间)有什么想法吗?
    • 要获得您需要的值:Console.WriteLine(consoleText.TheText);。这将Get 值。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      为了避免这种情况,试试这个

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

      或者空的get set方法

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-15
        • 1970-01-01
        • 2014-06-22
        • 1970-01-01
        • 2012-03-08
        • 2014-07-24
        • 2010-11-05
        相关资源
        最近更新 更多