getter和setter在C#中的作用是什么?如何将它们与数组一起使用
本文关键字:数组 一起 setter 是什么 作用 getter | 更新日期: 2023-09-27 17:57:36
1)我对编程还很陌生,读过一些关于getter和setter的文章。但我真的不明白为什么要用它们。。有人能解释一下吗,或者给我指一篇文章?(我读到的那些对我来说不是很容易理解…)
2) 在我当前的项目中,我有一个类,我在其中声明并初始化一个结构数组。我现在需要从另一个类访问数组,但它给出了错误:An object reference is required to access non-static member 'BaseCharacter.Attributes'
。
我想这可能意味着我需要使用getter和setter?但是这对数组是如何工作的呢?
提前感谢!
西蒙。
编辑:第二个问题解决了,这让我想到了另一个问题。当我想在另一个类中使用某个类时,我正在创建该类的新实例,对吗?这意味着我得到了原始值?但那不是我想要的。
第二个类用于生成UI,并且需要我保存在第一个类中的值。
在某个时刻,我将实现保存文件(XML,甚至在稍后阶段的服务器上)。然后我可以从这些文件中获取值吗?
对于getter和setter(使用它们的东西被称为Properties)来说,这只是一种方便且美观的方式,可以让人们认为他们在使用变量,但无论何时更新或访问变量,都可以进行一些计算。例如:
BankAccount.Interest
看起来比好
BankAccount.GetInterest()
尽管在这两种情况下,您都可以在请求时计算利息。
它们还用于使变量能够从类外访问,但只能通过以下技术在类内更改:
public double Interest {
get;
private set;
}
对于正在使用的setter示例,如果您曾经使用过Windows窗体并更新了控件的Height
或Width
属性,那么您正在使用setter。虽然看起来您使用的是像c.Height = 400
这样的普通实例变量,但实际上是让c
通过在新位置重新绘制来更新它的位置。因此,setter会在变量发生更改时准确地通知您,这样您的类就可以根据新值更新其他内容。
房地产的另一个应用是,你可以检查人们试图将房地产设置为的价值。例如,如果你想为每个银行账户保持利率,但不想允许负数或超过50的数字,你只需要使用一个设置器:
private int _interestRate = someDefault;
public int InterestRate {
get { return _interestRate; }
set {
if (value < 0 || value > 50)
throw new SomeException(); // or just don't update _interestRate
_interestRate = value;
}
}
这样,人们就不能将公共值设置为无效值。
对于你的第二个问题,你可以根据你想做的事情做两件事中的一件
一个:您可以使该成员成为static
。这意味着整个类只存在其中一个,而不是每个类实例都存在一个。然后您可以通过ClassName.MemberName
访问它。
你可以这样做:
// inside the BaseCharacter class definition:
public static SomeStruct[] Attributes = new SomeStruct[size];
// then to use it somewhere else in your code, do something with
BaseCharacter.Attributes[index]
Two:您必须创建一个类的实例,并通过该实例访问数组。这意味着每个对象都有自己独立的数组。
你可以这样做:
BaseCharacter bc = new BaseCharacter();
// use bc.Attributes
第二个可能是你想要做的,因为你可能想要将每个角色的属性与所有其他角色分开修改。
实际上,您提到的错误与getters和setters概念无关,这是因为在创建类之后,您需要在使用其成员之前创建一个对象;将类视为文档的模板,将对象视为文档
你很可能正在做这样的事情:
var someVar=BaseCharacter.Attributes;
当你应该做这样的事情:
var someVar=新的BaseCharacter();var someOtherVar=someVar.Attributes;
关于为什么是先发球员和先发球员,赛斯·卡耐基的《答案》很好地涵盖了这一点。
如果你是面向对象编程的新手,你可能会错过一个重要的概念,那就是封装。
类的字段(属性)只能从类(或其继承的类)中访问。也就是说,如果我们有一个类的人,只有一个名字,你就可以做
public class Person
{
public string Name;
}
因此,在你的程序中的任何地方,你都可以通过以下操作访问它:
Person person = new Person();
person.Name = "Andre";
这是有效的,但没有封装。在一些语言中,比如C++或Java,它是这样做的:
public class Person
{
private string _name;
public string setName(string newName)
{
this._name = newName;
}
public string getName()
{
return this._name;
}
}
Person person = new Person();
person.setName("Andre");
这使得我们的_name属性被封装,它只能通过它的get和set方法(也就是说,通过类的接口)来检索。
C#使这更容易,允许getter和setter:
public class Person
{
private string name;
public string Name
{
get { return this.name; }
set { this.name = value; }
}
}
Person person = new Person();
person.Name = "Andre";
这与第二个示例(Java/C++方式)非常相似,但您将Name视为属性,而不是方法,并将我们的Name属性封装在
1)它们看起来可能是可选的,但它们允许您对代码进行更多控制:
您可以截取新值并避免设置它们(例如,排除毫无意义的值)。此外,您还可以在属性更改或更新时激发自定义事件(就像WinForms控件一样)。
private string name;
public string Name
{
get
{
// running additional code, e.g. here I avoid returning 'null' for a name not set
if(name == null)
return "(Unknown)";
return name;
}
set
{
// checking incoming values, e.g. here I avoid setting an empty name
name = value != null && value.Length > 0 ? name : null;
// running more/additional code, e.g. here I raise an event
if(OnNameChange)
OnNameChange();
}
}
2) 在不了解代码的情况下,很难告诉你确切的原因,但如果你想访问某个成员变量或属性,你必须创建该类的对象或使变量静态(例如,在对象的所有实例之间共享):
class MyClass
{
public static int someNumber = 55;
public int thisNumber;
}
// ...
int someothervar = MyClass.someNumber; // access the static member variable
MyClass mc = new MyClass(); // create an object of the class
int yetanothervar = mc.thisNumber; // access the member variable