c# 如何使用 属性

c# how to use Property

我想了解更多关于 c# 的知识,我听说您应该使用 Private 说明符并使用 get/set 使其成为 public。

我有一个小应用程序可以获取文本框数据并将其写入文件。它加密文件。

但是我无法理解关于 getter 和 setter 的概念。这是我写入文件的 classes 和方法之一。

     class MyClass
{
     public static bool WriteToFile(string text)
    {
        string FileName = "C:\crypt\crypt.txt";
        try
        {
            using (System.IO.StreamWriter WriteToFile = new System.IO.StreamWriter(FileName))
            {
                WriteToFile.Write(text);
                WriteToFile.Close();
            }
            return true;
        }
        catch
        {
            return false;
        }
    }

但是我想使用 属性。我应该怎么做?

这就是我从主 class 传递文本框数据的方式。

        public void button1_Click(object sender, EventArgs e)
    {
        MyClass c = new MyClass();
        if (MyClass.WriteToFile(textBox1.Text))
            MessageBox.Show("success, managed to write to the file");
        else
            MessageBox.Show("Error, Could not write to file. Please check....");

看了各种教程https://channel9.msdn.com/series/C-Fundamentals-for-Absolute-Beginners/15和教程,实在是吃力不讨好

好吧,我认为你不需要 属性,但如果我们假设你不想创建某种包装器 class 来处理你对文件的所有写入你可以按照

的方式做一些事情
class AwesomeFileWriter
{
    private const string FileName = "C:\crypt\crypt.txt";
    private readonly string _text;

    public AwesomeFileWriter(string text)
    {
        _text = text;
    }

    public bool WriteToFile()
    {
        try
        {
            using (System.IO.StreamWriter WriteToFile = new System.IO.StreamWriter(FileName))
            {
                WriteToFile.Write(_text);
                WriteToFile.Close();
            }
            return true;
        }
        catch
        {
            return false;
        }
    }
}

WriteToFile 是一个 方法 .

方法是方法,属性是属性。

方法封装了行为,属性封装了state.

WriteToFile不应该是属性,因为它没有封装状态。事实上,它试图写入文件系统。

属性 的一个例子是:

public class MyClass
{
      private bool _canWrite;

      /// Checks whether the file can be written into the file system
      public bool CanWrite 
      {
          get { return _canWrite; }
      }
}

来自另一个 class,你可以这样称呼它:

if(myClass.CanWrite)
{
     // ...
}

注意 CanWrite 没有定义任何行为,它只是为 _canWrite 字段定义了一个 getter,这确保了外部 classes 不会得到看太多关于你的 class。

另请注意,我只定义了一个getter,这可以防止其他人设置您的属性。

除了一件小事外,您的设计没有太多需要更改的地方。但首先要做的是:

您可以将该代码放入 属性 中吗?当然。你应该?一点也不。你的方法 WriteToFile 实际上是在做某事。这就是方法的用途。另一方面,属性用于 modifying/storing 数据。

这就是为什么 属性-名称听起来更像名称,而方法名称通常听起来像命令:

例子

public class Sample
{
    private string someText;

    // This Property Stores or modifies SomeText
    public string SomeText 
    {
        get { return this.someText; }        
        set { this.someText = value; }
    }

    // Method that does sth. (writes sometext to a given File)
    public void WriteSomeTextToFile(string File)
    {
         // ...
    }
}

为什么properties/modifiers?

像上面的例子一样,将数据封装在属性中被认为是一种很好的做法。一个小的改进可能是像这样使用 AutoProperty:

public string SomeText { get; set; }

这基本上导致与第一个示例中封装字段组合相同的结构。

为什么?:因为这可以很容易地切换它或向您的 get/set-operations 添加逻辑。

例如,您可以添加验证:

public string SomeText 
{
        // ...
        set
        { 
            if (value.Length > 100)
                throw new Exception("The given text is to long!");

            this.someText = value; 
        }        
}

旁注:可能会改进您的 class

我能想到的唯一改进是不要在你的 write 方法中吞下异常:

public void WriteToFile()
{
    using (var fileWriter= new System.IO.StreamWriter(FileName))
    {
        fileWriter.Write(_text);
        fileWriter.Close();
    }
}

这更简洁,您不必 "decision" 级联处理相同的问题(您的 try/catchif/else ) 实际上也在做同样的事情。

public void button1_Click(object sender, EventArgs e)
{
    try
    {
        var c = new MyClass();
        c.WriteToFile(textBox1.Text))
        MessageBox.Show("success, managed to write to the file");
    }
    catch(Exception e)
    {
        MessageBox.Show("Error, Could not write to file. " + e.Message);
    }
}

这样,您不仅有相同的行为,而且您还可以获得更多信息,而不仅仅是您的操作不成功的原始事实 (false)

通常属性用于将值保存为属性;特征;设置。

您认为是动作的方法和函数。

例如下图:

public class MyClass{

/// <summary>
/// Keeps the file name
/// </summary>
public string FileName { get; set; }

/// <summary>
/// Action to write the file
/// </summary>
/// <returns>Returns true if the info. was wrote into the file.</returns>
public bool WriteToFileSucceed()
{        
    try
    {
        using (System.IO.StreamWriter WriteToFile = new System.IO.StreamWriter(FileName))
        {
            WriteToFile.Write(text);
            WriteToFile.Close();
        }
        return true;
    }
    catch
    {
        return false;
    }
}}

...

public void button1_Click(object sender, EventArgs e){

MyClass myClass = new MyClass();

myClass.FileName = @"C:\crypt\crypt.txt";

if(myClass.WriteToFileSucceed())
{
    MessageBox.Show("Success, managed to write to the file");
}
else
{   
    MessageBox.Show("Ops! Unable to write to the file.");
}}

在不实际向您展示代码的情况下,我将尝试解释 getter 和 setter,以便您理解它们的概念。

A 属性 看起来像内部 class 的方法和外部 class 的字段。

例如您可以在 属性 中执行逻辑,而当您从不同的 class 调用 属性 时,它的行为与任何其他字段一样。

GET:用于检索和return一个属性。您可以在实际 returning 您的 属性 之前执行一些复杂的逻辑。您可以通过 Get 安全地公开私有变量,而不会影响写入。

SET:用于设置一个属性的值,可以是private、constant或public。您可以控制变量的设置。