Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C# -不能在派生类构造函数中设置只读属性和字段

C# -不能在派生类构造函数中设置只读属性和字段
EN

Stack Overflow用户
提问于 2019-08-05 07:53:22
回答 1查看 2.8K关注 0票数 5

我有一个类结构,如下所示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
abstract class AMyAbstractClass {
    public readonly int MyReadonlyField;
    public int MyReadonlyProperty { get; }//read-only auto-property (syntactic sugar)
}
class MyConcreteClass : AMyAbstractClass {
    MyConcreteClass() {
        this.MyReadonlyField = 1;
        this.MyReadonlyProperty = 1;
    }
}

这会引发编译错误。

只读字段不能分配给(构造函数或变量初始化器除外)

属性或索引器的AMyAbstractClass.MyReadonlyProperty不能分配给--它是只读的

分别使用。

在第一种情况下,错误消息是错误的,因为它是在构造函数中设置的!

我可以想出其他方法来拥有不可变的对象属性,但是为什么这种情况是不允许的呢?这种封装的良好实践是什么?

EN

回答 1

Stack Overflow用户

发布于 2019-08-05 07:57:47

您需要通过基类的构造函数传播它们:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
abstract class AMyAbstractClass {
    public readonly int MyReadonlyField;
    public int MyReadonlyProperty { get; }//syntactic sugar
    protected AMyAbstractClass (int fieldValue, int propertyValue) {
        this.MyReadonlyField = fieldValue;
        this.MyReadonlyProperty = propertyValue;
    }
}
class MyConcreteClass : AMyAbstractClass {
    public MyConcreteClass() 
        : base(fieldValue: 1, propertyValue:1) {
    }
}

关于readonly字段。来自ECMA-334 C#语言规范,第15.5.3章的参考:

当字段声明包括只读修饰符时,由声明引入的字段是只读字段。对只读字段的直接赋值只能作为声明的一部分进行,或者在同一个类中的实例构造函数或静态构造函数中进行。

以及对只读自动属性的描述来自c# 6:

..。属性只能在构造函数的正文中设置:

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57362098

复制
相关文章
Input设置只读属性
input设置为只读一般用于查看详情: 格式为: (1)单纯的input框 <div class="form-group"> <label for="conpanyName" class="col-sm-2 control-label col-sm-offset-2">公司名称</label> <div class="col-sm-4"> <input type="text" class="form-control" id="
wfaceboss
2019/04/08
7.8K0
TypeScript中的可选属性和只读属性
可选属性 接口里的属性不全都是必需的。 有些是只在某些条件下存在,或者根本不存在。 例如给函数传入的参数对象中只有部分属性赋值了。带有可选属性的接口与普通的接口定义差不多,只是在可选属性名字定义的后面
孙亖
2018/06/07
2.9K0
学习记录——对于C#中构造函数和属性的备忘录
首先有两个类,分别为Program类和Customer类作为参考。其中Program中存放主函数, Customer类中存放customer的属性。
MrLi001
2022/01/27
5780
语法基础(三十七)-修饰符总结
使用abstract修饰的类为抽象类,抽象类只能是其他类的基类,不能与sealed、static一起使用。 abstract可以修饰抽象类中的方法或属性,此时,方法或属性不能包含实现,且访问级别不能为私有。 抽象类不能被实例化。
孙寅
2020/06/16
4760
是否能在构造函数,析构函数中抛出异常?
宋凯伦
2018/01/04
3.7K0
python中,类属性为只读属性
class Computer: """电脑""" # __slots__ = ('_name', 'mem', 'cpu') def __init__(self, name, mem, cpu): self._name = name self.mem = mem self.cpu = cpu @property def name(self): # 只读, getter方法 return self._na
py3study
2020/01/07
1.6K0
定义枚举的构造函数、方法和字段
import org.junit.Test; public class lan { @Test public void test(){ print(Grade.D); } public void print(Grade g) { String valueString = g.getValue(); System.out.println(valueString); } }
MonroeCode
2018/01/11
1.2K0
lua中设置只读table
C++里有const用来定义常量,保护参数或函数意外地修改,提高程序的健壮性。在lua里虽然没有没有类似的关键字,我们可以用表来模拟实现其只读的功能,来保护我们的数据被意义地修改。
王亚昌
2018/08/03
2.9K0
C# 9.0 新特性预览 - init-only 属性
随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章将向大家展示它们。
Jlion
2022/04/07
5660
解析C#类中的构造函数
彭泽0902
2018/01/04
3.4K0
js 中的构造函数,构造函数作用,构造函数和普通函数的区别
函数的定义方式: 1.声明式函数定义: function 函数名 (){};这种定义方式,会将函数声明提升到该函数所在作用域的最开头,也是就无论你在这个函数的最小作用域的那儿使用这种方式声明的函数,在这个作用域内,你都可以调用这个函数为你所用。 2.函数表达式:let fun = function(){}; 此方式定义的函数,只能在该作用域中,这段赋值代码执行之后才能通过fun()调用函数,否则,由于变量声明提升,fun === undefined。 3.new Function 形式: var fun1 = new Function (arg1 , arg2 ,arg3 ,…, argN , body );Function构造函数所有的参数都是字符串类型。除了最后一个参数, 其余的参数都作为生成函数的参数即形参。这里可以没有参数。最后一个参数, 表示的是要创建函数的函数体。
全栈程序员站长
2022/10/04
3.5K0
dotnet C# 基础 为什么 GetHashCode 推荐只取只读属性或字段做哈希值
在 C# 里面,所有的对象都继承 Object 类型,此类型有开放 GetHashCode 用于给开发者重写。此 GetHashCode 方法推荐是在重写 Equals 方法时也同时进行重写,要求两个对象在 Equals 返回相等时,两个对象的 GetHashCode 返回值也相等。反过来则不然,允许有两个不相等的对象的 GetHashCode 是相等的 在重写 Equals 方法时,大部分时候都是自动生成的,如将类里面的所有字段或属性都进行一一比较。那在 GetHashCode 方法里面,所输出的哈希值的计算,是否也需要使用此类型的所有字段或属性共同计算出来?如果在 GetHashCode 里面使用的字段或属性非只读,那么 ReSharper 将会警告你这是不安全的。本文将来告诉大家为什么这是不安全的
林德熙
2021/10/12
6320
python @property 设置只读属性 重写 getter setter 方法
@property广泛应用在类的定义中,可以让调用者写出简短的代码,就可以重写属性的 get 和 set 方法,同时保证对参数进行必要的检查,这样,程序运行时就减少了出错的可能性。
onety码生
2018/11/21
2.6K0
窗体构造函数——c#
c#窗体构造函数比窗体加载函数Form1_Load()还要早,构造窗体最先运行的函数
vv彭
2020/12/16
1.3K0
C# 静态构造函数
1、在类实例被初始化的时候执行 2、在类的静态成员被调用的时候执行 3、静态构造函数只会被执行一次,代码如下: static class Program { static
郑小超.
2018/04/16
8730
C# 静态构造函数
派生类的构造过程
1、先基类、后对象、再子类 多继承,初始化顺序跟基类的声明顺序有关,从左到右。 对象 ,与声明类的顺序有关,从上到下。
我与梦想有个约会
2023/10/20
1420
派生类的构造过程
【Groovy】循环控制 ( Java 语法循环 | 默认的 IntRange 构造函数 | 可设置翻转属性的 IntRange 构造函数 | 可设置是否包含 to 的构造函数 | 0..9 简写 )
0…9 的描述 , 相当于 new IntRange(0, 9) , 二者是等价的 ;
韩曙亮
2023/03/30
1.2K0
【Groovy】循环控制 ( Java 语法循环 | 默认的 IntRange 构造函数 | 可设置翻转属性的 IntRange 构造函数 | 可设置是否包含 to 的构造函数 | 0..9 简写 )
C#9.0:Init
在以前的C#版本里面,如果需要定义一个不可修改的的类型的做法一般是:声明为readonly,并设置为只包含get访问器,不包含set访问器。如下:
用户9127601
2021/11/01
3470
【Kotlin】类的初始化 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数中定义成员属性 | 次构造函数 | 构造函数默认参数 )
在 Kotlin 类中 , 可以在 类声明 时 在 类名后 定义 " 主构造函数 " ;
韩曙亮
2023/03/30
4.9K0
TypeScript-索引签名和只读属性
索引签名和只读属性是TypeScript中的两个重要概念。索引签名允许您创建动态属性的对象,提高灵活性,而只读属性通过 "readonly" 关键字确保属性不可被修改,有助于保持对象的不可变性。这两个特性共同帮助开发者编写更具可维护性和类型安全性的代码
杨不易呀
2023/09/28
2310
TypeScript-索引签名和只读属性

相似问题

在构造函数本地函数c#中设置只读字段

10

如何在C#异步构造函数中设置只读属性

26

在链式构造函数中设置只读字段

32

在派生类中设置属性为只读

60

没有显式构造函数和只读属性的C#类

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文