NET问答: 为什么仅有 getter 的属性,还可以在构造函数中赋值 ?

咨询区

  • Noam B.

我建了一个这样的属性。


public int Foo { get; } 

毫无疑问,这是一个只读属性,当我在构造函数中无意对它赋值时,我发现居然可以改变它的值???比如下面的代码。


public MyClass(string name)
{Foo = 5;
}

为什么会这样?它不是只读的吗?

回答区

  • Yacoub Massad

首先这是 C#6 引入的新特性,它允许我们创建只读的属性,但这里有一个问题,实践中我们常常需要给这个只读属性赋予一个非默认值,比如你这里的 Foo=5 而不是它原生的 Foo=0,所以这是一个设计哲学问题。

如果你想在 构造函数 之外修改属性的值,这时候 ReadOnly 的限定就会让其抛出一个编译时错误了。

  • Rahul Nikate

自动属性是在 C# 3.0 中被引入的,它的好处就是帮你省去了人肉 field 的繁琐,接下来你可以通过 构造函数 初始化自动属性为一个非 default 值,在 C# 6.0 中又做了进一步简化,可以直接使用 属性初始化器 对属性进行初始化操作,省去了构造函数的繁琐赋值。

在之前你可能需要这样做。


public class MyClass
{public int Foo { get; }public MyClass(int foo){Foo = foo;}
}

现在你可以使用 属性初始化器 了。


public string Foo { get; } = "SomeString";public List<string> Genres { get; } = new List<string> { "Comedy", "Drama" };

点评区

其实这种问题,看 IL 代码是最清楚的。


.class public auto ansi beforefieldinit ConsoleApp3.MyClassextends [mscorlib]System.Object
{// Fields.field private initonly int32 '<Foo>k__BackingField'.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (01 00 00 00).custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = (01 00 00 00 00 00 00 00)// Methods.method public hidebysig specialname instance int32 get_Foo () cil managed {.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (01 00 00 00)// Method begins at RVA 0x205c// Code size 7 (0x7).maxstack 8// return <Foo>k__BackingField;IL_0000: ldarg.0IL_0001: ldfld int32 ConsoleApp3.MyClass::'<Foo>k__BackingField'IL_0006: ret} // end of method MyClass::get_Foo.method public hidebysig specialname rtspecialname instance void .ctor (int32 foo) cil managed {// Method begins at RVA 0x2064// Code size 16 (0x10).maxstack 8// {IL_0000: ldarg.0// (no C# code)IL_0001: call instance void [mscorlib]System.Object::.ctor()IL_0006: nop// Foo = foo;IL_0007: nopIL_0008: ldarg.0IL_0009: ldarg.1IL_000a: stfld int32 ConsoleApp3.MyClass::'<Foo>k__BackingField'// }IL_000f: ret} // end of method MyClass::.ctor// Properties.property instance int32 Foo(){.get instance int32 ConsoleApp3.MyClass::get_Foo()}} // end of class ConsoleApp3.MyClass

从上面的 .field private initonly int32 '<Foo>k__BackingField' 可以看出, '<Foo>k__BackingField' 被 readonly 标记了,构造函数中只是对其原始 field 进行赋值,参考如下代码:

public class MyClass{private readonly int <Foo>k__BackingField';public MyClass(int foo){<Foo>k__BackingField' = foo;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301324.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

次优二叉树

在有序序列的查找中&#xff0c;如果各个元素的查找概率都是一样的&#xff0c;那么二分查找是最快的查找算法&#xff0c;但是如果查找元素的查找概率是不一样的&#xff0c;那么用二分查找就不一定是最快的查找方法了&#xff0c;可以通过计算ASL来得知。所以基于这种查找元素…

每日一笑 | 老板,黑凤梨真的能吃吗?

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图片来源于网络&#xff0c;侵权删&#xff09;

vue获取全局组件_Vue的全局组件

Vue是一个组件化开发的框架&#xff0c;一般我们在项目中使用组件的步骤是这样的。1.创建一个组件&#xff1a;比方说我们现在新建一个demo.vue文件&#xff0c;随便写一行代码。{{msg}}export default {data() {return {msg:只是新创建的一个组件}}}2.使用组件在我们需要使用组…

crontab执行shell脚本日志中出现乱码

使用nutch开源的搜索引擎抓取网页信息&#xff0c;通过计划任务crontab执行shell脚本&#xff0c;并将启动信息记录进日志文件&#xff0c;但是每次都会出现乱码&#xff0c;如图所示经过反复测试&#xff0c;排除了java程序问题&#xff0c;文件权限问题&#xff0c;系统字符集…

学好数学建模,走哪买菜都不怕!

随着新学期的开始&#xff0c;数学建模的热度也在逐步回温&#xff08;据说大家开始了数学建模知识储备&#xff09;&#xff0c;常有小伙伴私聊小天咨询关于数学建模的事情。大大小小的数学建模比赛如火如荼开展着&#xff0c;而如何快速掌握数学建模&#xff0c;做好充足的准…

shell最大出现和连续出现次数_shell脚本分析 nginx日志访问次数最多及最耗时的页面(慢查询)...

当服务器压力比较大&#xff0c;跑起来很费力时候。我们经常做站点页面优化&#xff0c;会去查找那些页面访问次数比较多&#xff0c;而且比较费时。 找到那些访问次数高&#xff0c;并且比较耗时的地址&#xff0c;就行相关优化&#xff0c;会取得立竿见影的效果的。 下面是我…

[翻译]Go与C#的比较,第二篇:垃圾回收

Go vs C#, part 2: Garbage Collection | by Alex Yakunin | ServiceTitan — Titan Tech | Medium目录译者注什么是垃圾回收&#xff1f;什么是GCBurn&#xff1f;峰值分配吞吐量&#xff08;"速度测试"&#xff09;GCBurn 测试GC Burn测试结果结论.NET CoreGo两者…

写在《ASP.NET MVC 4 Web 编程》即将出版之际!献给有节操的程序员!

《Programming ASP.NET MVC 4》中文版即将上市了&#xff01;非常荣幸我可以再次参与一本不错的技术书籍的翻译工作。 这也是在《WCF技术内幕》与《WCF服务编程》第三版之后&#xff0c;翻译的第三本书。此书由世界上最著名的计算机出版社Oreilly出版&#xff0c;中文版本由华中…

日本码农为了萝莉,竟然在GitHub上做这种事,“警察,快来抓我啊!”

全世界只有3.14 % 的人关注了数据与算法之美近日&#xff0c;日本刈谷市警方抓了一名13岁的小女孩&#xff0c;原因是“她将一段恶意代码的链接放到了网上&#xff0c;导致一千多台电脑系统崩溃。”其实&#xff0c;这就是一个入门级的恶作剧无限弹窗而已&#xff0c;只要你点了…

10玩rust_C++工程师的Rust迁移之路(5)- 继承与组合 - 下

2020-11-25 更新&#xff1a;修正了C 20中的concept语法在上一篇文章 https://zhuanlan.zhihu.com/p/76740667 中&#xff0c;我介绍多态、静态分发和动态分发的概念&#xff0c;以及他们各自在C和Rust中的实现方式。在本文中&#xff0c;我会重点讲Rust中的Trait实现的静态分发…

带老弟做个实时排行榜

阿巴可懂的实时排行榜设计和实现思路。大家好&#xff0c;我是鱼皮&#xff0c;暑假快到了&#xff0c;我的老弟小阿巴听说我家有很多好康的&#xff0c;就跑来找我玩。结果我摆出了几个以前开发过的小系统&#xff0c;准备在这段时间带着小阿巴多做些作品&#xff0c;学习编程…

c++ memcpy与strcpy的比较

1&#xff1a;区别memcpy可以拷贝任何数据类型的对象&#xff0c;指定拷贝的数据长度。strcpy只能拷贝字符串了&#xff0c;它遇到\0就结束拷贝2&#xff1a;性能static inline char *__kernel_strcpy(char *dest, const char *src){char*xdest dest;asmvolatile("\n&quo…

每日一笑 | 在托运行李时,怎样才能不会因为超重被罚钱?

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图片来源于网络&#xff0c;侵权删&#xff09;

加时间水印_如何在手机照片上添加时间和日期?打开这个设置即可添加,超方便...

经常在朋友圈或者微博刷到一些照片&#xff0c;上面带有拍照时间和地点&#xff0c;甚至是天气&#xff0c;很多人还不知道是怎么操作的吗&#xff0c;今天小编就来告诉大家怎么操作&#xff0c;1分钟包学包会&#xff01;1、照片添加文字、地址、天气打开手机相机&#xff0c;…

少儿编程教育是“揠苗助长”还是要培养未来的程序员?

▲数据汪特别推荐点击上图进入玩酷屋去年有一款名叫CoderMindz的棋类游戏在硅谷名声大噪&#xff0c;它的前身CoderBunnyz发布不到一年时间&#xff0c;销量超过1000余套&#xff0c;销售额以超35000美元&#xff0c;因此大家对新款CoderMindz充满期待。而这款游戏的开发者&…

创建一个列表

/* Note:Your choice is C IDE */#include "stdio.h"#include "malloc.h"struct node{intdata;structnode *next;};typedef struct node NODE;NODE *create_linklist(int n){NODE*p,*q,*head;inti;p(NODE*)malloc(sizeof(NODE));headp;printf("请输入…

日志ILog(文件日志/控制台日志/控件日志/网络日志)

日志组件是NewLife系列组件最早最基础&#xff0c;同时也是流血流泪最多的一个模块&#xff0c;它的底蕴定能感动每一个用户&#xff01;没有日志的应用系统是不完整的。系统遇到啥问题&#xff0c;翻日志看看当时上下文&#xff0c;实在分析不出问题&#xff0c;修改代码再打几…

php crypt mysql password_php使用crypt()函数进行加密

一、代码$str 应用crypt()函数进行单向加密!; //声明字符串变量$strecho 加密前$str的值为&#xff1a;.$str;$crypttostr crypt($str); //对变量$str加密echo 加密后$str的值为&#xff1a;.$crypttostr; //输出加密后的变量?>二、运行结果参数不带salt&#xff0c;每次…

.NET 容器环境下创建应用 dump 文件

.NET 容器环境下创建应用 dump 文件Intro有时候我们的应用会出现一些异常的情况&#xff0c;比如内存飙升&#xff0c;线程死锁等等&#xff0c;通过一些 metrics 我们可能大概的了解内存是增长了&#xff0c;但是具体是哪里增长了&#xff0c;单单看内存的变化很难看出来哪里导…

安装mysql二进制文件_MySQL二进制文件规范安装

演示环境介绍操作系统&#xff1a;CentOS 6.7 (64位)二进制包&#xff1a;MySQL-5.6.30-linux-glibc2.5-x86_64.tar.gzMySQL 下载地址&#xff1a;http://dev.mysql.com/downloads/1、下载MySQL# mkdir /root/mysql# cd /root/mysql# wget http://dev.mysql.com/get/Downloads…