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
/catch
和 if
/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。您可以控制变量的设置。
我想了解更多关于 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
/catch
和 if
/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。您可以控制变量的设置。