C#中使用的getter和setter是什么?如何将它们与数组一起使用?

如何解决C#中使用的getter和setter是什么?如何将它们与数组一起使用?

| 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;
}
例如,如果您曾经使用Windows窗体并更新了控件的
Height
Width
属性,则使用的是setter。看起来您正在使用普通的实例变量,例如
c.Height = 400
,但实际上是让
c
通过在新位置重画来更新其位置。因此,设置器会在变量更改时准确通知您,以便您的类可以根据新值更新其他内容。 属性的另一个应用是您可以检查人们尝试将属性设置为的值。例如,如果您想为每个银行帐户维持一个利率,但又不想允许负数或超过50的数字,则只需使用setter:
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]
二:您必须创建该类的实例,然后通过该类访问数组。这意味着每个对象将具有其自己的单独数组。 您可以这样做:
BaseCharacter bc = new BaseCharacter();
// use bc.Attributes
第二个可能是您想要做的,因为您可能想要与其他所有字符分开修改每个字符的属性。     ,实际上,您提到的错误与getter和setters概念无关,这是因为在创建类之后,需要在使用对象之前创建对象。将类视为文档的模板,将对象视为文档 您最有可能这样做:   var someVar = BaseCharacter.Attributes; 当您应该执行以下操作时:   var someVar = new 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
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-