首页
学习
活动
专区
圈层
工具
发布
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    荐读|属性与可直接访问的数据成员之间应该如何选

    写在前面 在书写C#代码的时候你是否有过这样的经历:经常混用属性以及公有的数据成员。毕竟他们的用法基本一致,对于使用来说好像没什么区别啊。...属性既可以令调用者通过公有接口访问相关的数据成员 , 又可以确保这些成员得到面向对象式的封装。 注:在C#语言中, 属性这种元素可以像数据成员一样被访问, 但它们其实是通过方法来实现的。...可以是抽象的,并成为接口的一部分 属性也可以是抽象的,从而成为接口定义的一部分,这种属性写起来与隐士属性相似。下面这段代码,就演示了怎样在泛型接口中定义属性。...其他说明 后期再把数据成员改成属性 尽管属性是个相当好的机制,可是还有人想先创建普通的数据成员,然后在确实有必要的情况下再将其替换成属性,以便使用属性所具备的优势。...在日常的开发中虽然用属性的形式来封装变量会占用你一到两分钟的时间,但是如果你一开始没有使用属性,后来想用属性来设计,那么可能就得用好几个小时去修正了。现在多花点时间,将来会省很多功夫。

    1.2K30

    C#14新特性一览,你觉得实用吗?

    在本文中,我们将一起探索即将随 C# 14(对应 .NET 10)发布的一些新特性。...在早期的 C# 中,我们通常使用自动属性(Auto Properties): public int Foo { get; set; } 如果需要在 get 或 set 中添加自定义逻辑,就得手动添加一个...从 C# 14 开始,field 关键字带来了全新的简洁写法,允许你在不显式声明后备字段的情况下,编写带逻辑的属性访问器: public int Foo { get {...然而,如果我们想对一个对象的属性进行赋值操作,就不得不手动加判断: if (foo is not null) { foo.Bar = 20; } 而在 C# 14 中,这种写法可以被简化为:...总结 在本文中,我们探索了 C# 14 中的三个新特性: 使用 field 关键字简化属性封装 更强大的扩展成员语法支持方法和属性的扩展 更优雅的空条件赋值方式 这些新特性让 C# 在简洁性与功能性之间找到了更好的平衡

    16700

    ASP.NET MVC Controller激活系统详解:总体设计

    而通过属性HttpContext和RouteData属性返回的HttpContextBase和RouteData对象在默认情况下实际上就是组成RequestContext的核心元素。...而在默认的情况下,这个作为路由数据的名称只能帮助我们解析出Controller的类型名称,如果我们在不同的命名空间下定义了多个同名的Controller类,会导致激活系统无法确定具体的Controller...,前者可以视为后者的一种后备。...除此之外,在调用AreaRegistrationContext的MapRoute方法时还会在注册Route对象DataTokens中添加一个Key为“UseNamespaceFallback”的条目表示是否采用后备命名空间对...MvcRouteHandler维护着一个ControllerFactory对象,该对象可以在构造函数中指定,如果没有显示指定则直接通过调用当前ControllerBuilder的GetControllerFactory

    1.9K60

    面向 JavaScript 开发人员的 ECMAScript 6 指南(3):JavaScript 中的类

    当克隆一个对象时,会保持对其原型对象的隐式引用。 在基于对象的环境中工作有其优势,但在没有基于类的概念(比如属性和继承)的情况下能执行的操作上也存在局限。...理想情况下,这意味着开发人员能各取所长。 属性和封装 无法公开和维护其状态的类不是一个真正的类。因此,ECMAScript 6 现在允许开发人员定义伪装为字段的属性函数。...不同于其他语言,ECMAScript 中的 property 语法不会在创建属性时静默地引入后备存储字段。(后备存储 是存储数据的地方 — 换句话说,是实际字段本身。)...静态属性和字段 如果不考虑回避 对面向对象的讨论,任何面向对象的讨论都是不完整的。当开始在代码中使用类时,知道如何处理全局变量和/或函数至关重要。...因此,尽管没有显式的语法来定义静态字段,但可以直接在类型对象上引用字段。在上面的示例中,Person 构造函数首先检查 Person 是否已有一个 population 字段。

    78740

    c#面试题抽象类和接口的区别-金三银四面试:C#程序员经常遇到的30道基础面试题,想你所想

    22、C#中没有运算符重载?能否使用指针?   23、C#中有很多类被定义为public有什么意义?   24、修饰符有什么含义?   ...您可以创建值类型的实例,将它们作为参数传递,将它们存储为局部变量,或将它们存储在另一值类型或对象的字段中。值类型没有与存储类的实例相关的系统开销,并且它们不需要构造函数。值类型可以有字段、属性和事件。...相反,流提供一种向后备存储器写入字节和从后备存储器读取字节的方式,后备存储器可以为多种存储媒介之一。正如除磁盘外在多种后备存储器一样,除文件流之外也存在多种流。...params关键字可以指定在参数数目可变处定义参数的方法。在方法声明中的params关键字之后不允许任何其他参数,并且在方法声明中只允许一个params关键字。   22、C#中没有运算符重载?...在定义具有内部访问能力的成员的程序集外部引用该成员是错误。   25、JAVA的代码是半编译半解释的,C#代码是否也是这样的?

    2.4K20

    ASP.NET应用下基于SessionState的“状态编程框架”解决方案

    实际上,我们的State框架还是建立在SessionState基础之上,但是它能够很好的解决上述的三大难题: 通过配置为所有使用到的状态项(状态属性名称、数据类型等)提供结构化的定义,并通过基于该结构化配置提供的代码生成使强类型编程成为可能...四、状态项后备策略的定义 判断一个存在于SessionState中的状态项是否应该被后备存储取决于以下三个方面,当同时满足条件1和2,或者2和3的状态项会被后备存储。...比如说,你可以生成一个继承自Page的类型,比如PageBase,添加如下一个State的属性。...; set; } 15: public Gender Gender { get; set; } 16: public string Address { get; set; }...; set; } 21: public string ProductName { get; set; } 22: } 如果让你的所有Web页面都继承自这个PageBase,你可以通过强类型的方式获取或者设置每个状态项了

    1.1K100

    C# 7.3新特性一览

    [Serializable] public class Foo { [field: NonSerialized] public string MySecret { get; set;...理想情况下, 这个自定义的ValueTuple类型会遵循与C# 7.3编译器同样的规则,但是,在如何处理嵌套元组和动态类型方面,可能会有微妙的差别。...在C# 7.3中,你可以在创建数组时对其初始化,就像你对普通数组所做的那样。该提案没有提供细节,但微软正考虑预初始化一个主数组,当函数被调用时可以快速复制。...理想情况下, 这个自定义的ValueTuple类型会遵循与C# 7.3编译器同样的规则,但是,在如何处理嵌套元组和动态类型方面,可能会有微妙的差别。...在C# 7.3中,你可以在创建数组时对其初始化,就像你对普通数组所做的那样。该提案没有提供细节,但微软正考虑预初始化一个主数组,当函数被调用时可以快速复制。

    1.4K30

    ASP.NET Web API路由系统:路由系统的几个核心类型

    路由系统中,当我们调用Route的GetVirtualPath方法根据定义在路由本身的URL模板和指定的路由变量生成一个完整的URL的时候,在URL模板与提供的路由变量相匹配的情况下会返回一个VirtualPathData...HttpRoute能够根据模板生成一个完整的URL取决于是否能够提供定义在URL模板中所有路由变量占位符的值,而这个路由变量值具有如下三个来源。...对象,这依赖于我们对Web API的寄宿方式,这并没有定义在ASP.NET Web API的核心框架之中。...八、缺省路由变量 我们在进行路由注册的时候可以为某个路由变量设置一个默认值,这个默认值可以是一个具体的变量值,也可以是通过RouteParameter具有如下定义的静态只读字段Optional返回的一个...,但是缺省路由变量具有不同之处:如果请求URL中没有提供对应变量的值,普通具有默认值的路由变量依然会出现在最终HttpRouteData的Values属性中,但是缺省路由变量则不会。

    10K110

    C# 学习笔记(11)—— C# 的春天

    在 C# 3.0 之前,定义属性一般会像下面这样去编写代码: class Person { private string name; public string Name { get...),你可以使用自动实现的特性来对属性的定义进行简化,此时不再需要额外定义一个私有的字段了 class Person { public string Name {get; set; } } 从改写后的代码可以看出...之所以可以这样定义,主要是因为编译器在编译时会帮我们创建一个私有字段 隐式类型 C# 是强类型语言,在定义一个变量时,需要声明变量的类型。然而类型长度如果过长,就可能会影响代码的可读性。...对象集合初始化器 在 C# 3.0 之前定义类,你往往需要定义多个构造函数来完成不同情况下的初始化。...匿名对象 匿名类型,顾名思义就是没有指明类型的类型,通过隐式类型和对象初始化器两种特性创建了一个类型未知的对象,使我们在不定义类型的情况下实现对象的创建,从而减少了类定义过长的代码,减少了开发人员的工作量

    34510

    C#学习笔记五: C#3.0自动属性,匿名属性及扩展方法

    Person 2 { 3 //使用自动实现的属性来定义属性 4 //定义可读写属性 5 public string Name{get; set;} 6 //定义只读属性...之所以可以这样定义属性, 主要是因为编译器在编译时会为我们创建一个私有字段. 利用反编译工具可以知道使用自动实现的属性时,C#都会帮我们创建必要的字段....是强类型语言, 在定义一个变量时, 需要声明变量的类型...., 通过隐式类型和对象初始化器两种特性创建了一个类型未知的对象, 使我们在不定义类型的情况下可以实现对象的创建,从而减少了类定义过程的代码. 1 class Program 2 { 3 static...对于C#3.0编译器而言, 当它看到某个类型的变量在调用方法时, 它会首先去该对象的实例方法进行chazhao,如果没有找到与调用方法同名并参数一致的实例方法, 编译器就回去查找是否存在合适的扩展方法.

    882100

    UriTemplate、UriTemplateTable与WebHttpDispatchOperationSelector

    ,请参考http://msdn.microsoft.com/en-us/library/bb675245.aspx 二、UriTemplate 在Web HTTP编程模型中,URI模板通过具有如下定义的...IgnoreTrailingSlash属性返回调用构造函数指定的同名参数,默认值为True,意味着在默认情况在模板字符串结尾指定的斜杠会被忽略。...我们可以指定基地址和变量值调用BindByName方法得到一个完整的URI。变量值可以通过字典和NameValueCollection对象的形式指定,其中的Key和Value分别表示变量名和变量值。...三、UriTemplateTable 具有如下定义UriTemplateTable本质上是一个KeyValuePair对象集合,我们可以使用任意类型的对象和某个...属性BaseAddress 表示基地址,可以在构造函数中初始化,也可以直接通过属性赋值的方式指定。

    1.2K60

    Newtonsoft.Json

    ; set; } } 【OptIn情况下,默认是将所有的属性都定义成了不要,如果这个属性需要转换成Json,需要标记JsonProperty】 转换后的 { ” Name“:”张三十“,...{ get; set; } } 【OptOut情况下,默认是将所有的属性都定义成了要转换Json,如果这个属性不需要转换成Json,需要标记JsonIgnore】 转换后的Josn { ” Name...” Hobby“:["音乐","跑步","看电影"] } 序列化时将非公共变量(private)转换为Json 分析:一般情况下,在进行Json转换的时候,只会对public 成员进行Json...为此,我们 可以设置下,如果值为Null值时,就不进行序列化转换。 方式1:在属性成员中指定NullValueHandling方式。...个属性成员,30个属性成员,然后,一个一个去设置很麻烦,有没有更高效的方式呢?

    2.8K80

    C#新语法(持续更新)

    在之前版本的C#中,类型必须定义在namespace中,从c#10开始可以采用如下写法,减少namespace的大括号嵌套 namespace ConsoleApp2; internal class...2、在引用类型后添加“?”修饰符来声明这个类型是可空的。对于没有添加“?”修饰符的引用类型的变量,如果编译器发现存在为这个变量赋值null的可能性的时候,编译器会给出 警告信息。...,也可以在访问可空的变量、成员的时候加上!...来抑制编译器的警告。 记录(record)类型 C#中的==运算符默认是判断两个变量指向的是否是同一个对象,即使两个对象内容完全一样,也不相等。...注意,默认情况下,编译器会生成一个包含所有属性的构造方法,因此,我们编写new Person()、new Person(“Yang”)这两种写法都是不可以的。

    24210

    C#中的方括号[](特性、属性)

    第一篇 特性和属性的对比 C#: +(特性 ) + Attitude C#(类)前面或者(方法)前面 (中括号)定义 首先要说的是,可能一些刚接触C#的朋友常常容易把属性(Property)跟特性(Attribute...如何避免这样的情况呢,我们可以在Run方法中加一段逻辑代码,先判断Age大小,如果小于2或大于60直接抛异常,但是2-60岁之间也得用Switch来分年龄阶段地判断speed参数是否合适,那么逻辑就相当臃肿...( 译者注:该属性为 bool 类型,默认值为 false ,意思就是该自定义 attribute 在同一语言元素上只能使用一次 ) Inherited 我们可以使用该属性来控制我们的自定义 attribute...该属性标识我们的自定义 attribute 是否可以由派生类继承。...is defined for this class 因为我们没有为 Version 这个属性定义任何任何值,所以在构造函数中设定的值被我们查询出来了。

    8.4K42

    C#匿名类型、var、dynamic的进化史

    { public string Name { get; set; } public int Age { get; set; } public string...Var登场 现在要使用匿名对象,则需要使用变量引用它。虽然我们在创建时没有指定对象的类型,但编译器会在编译过程中帮我们创建一个具有相关属性和方法的类型。...动态类型 dynamic 出场 对于匿名类型的使用一般局限于方法的局部,可理解为:随用随定义,用完就消失。有如下情况应该怎么办?...在这种情况下返回的类型不确定,可以使用 dynamic 来指明。...所以给dynamic变量赋任何类型值都正确,但在使用变量来取得某个属性值或调用某方法时(此时程序肯定处于Runtime状态),CLR会检查(反射)所调用的属性或方法是否存在,不存在报运行时异常。

    31510

    C# 9.0 中的新增功能

    请考虑以下定义: public record Person { public string LastName { get; } public string FirstName { get...属性初始值设定项可明确哪个值正在设置哪个属性。 缺点是这些属性必须是可设置的。 从 C# 9.0 开始,可为属性和索引器创建 init 访问器,而不是 set 访问器。...C# 初级开发人员可以用一两行代码 编写规范的“Hello World!”。 不需要额外的工作。 不过,经验丰富的开发人员还会发现此功能的许多用途。...4、模式匹配增强功能 C# 9 包括新的模式匹配改进: 类型模式要求在变量是一种类型时匹配 带圆括号的模式强制或强调模式组合的优先级 联合 and 模式要求两个模式都匹配 析取 or 模式要求任一模式匹配...但在某些情况下,额外的零初始化可能会对性能产生可衡量的影响, 特别是在使用 stackalloc 时。 在这些情况下,可添加 SkipLocalsInitAttribute。

    2K20
    领券