首页
学习
活动
专区
圈层
工具
发布

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

有了这些机制就不应该继续在类型中创建公有 ( publish) 字段, 也不应该继续手工编写get与set方法。...方便修改 在所有的类与结构中,应该多使用属性,这样可以让你在发现新的需求时,更为方便的修改代码。...INameValuePair { string Name { get; } T Value { get; set; } } 很方便的控制获取及设置权限 对于类型中的属性来说,它的访问器分成...因此如果把数据成员改成属性,则会破坏二进制层面的兼容机制,使得很难单独更新某一个程序集,需要全部更新。 属性的性能损耗 你可能要问了,是以属性的形式访问数据比较快,还是以数据成员的形式访问比较快?...总结 今天给大家介绍了使用属性来访问数据成员的诸多优势,因此建议如果要在类型的公有或受保护的接口中发布数据,那么应该以属性的形式来发布,对于序列或字典来说,应该以索引器的形式发布。

1.3K30

C#一分钟浅谈:属性与索引器的定义

在C#编程中,属性和索引器是两种非常重要的特性,它们使得类的设计更加灵活和易于使用。本文将从基本概念入手,逐步深入探讨这两个特性,并通过示例代码来帮助理解。属性:让字段更安全什么是属性?...属性在C#中提供了一种机制,使我们能够像访问公共字段一样访问私有字段,但实际上它是通过调用访问器方法来实现的。这样做的好处在于,可以在访问或修改字段值时执行额外的操作,比如验证输入数据的有效性。...Person类有一个名为Name的属性,它有两个访问器:get和set。...易错点与避免越界访问:当尝试访问不存在的索引时,会抛出IndexOutOfRangeException。应该在索引器中添加边界检查。...总结通过本文的学习,我们了解到属性和索引器是如何增强C#类的功能性的。合理地使用这些特性,可以使我们的代码更加健壮和易于维护。希望这些基础知识能帮助你在实际开发中更好地应用它们!

45310
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C#主构造函数

    这篇文章将深入探讨C#中主构造函数的概念、重要性、设计原则以及如何在实际编程中实现它们。...参数化:主构造函数应该接受所有必要的参数来初始化对象。这有助于避免在对象创建后对其进行修改。 不可变性:如果可能,对象的状态应该在构造后不可变。这可以通过在构造函数中设置所有属性的最终值来实现。...实现主构造函数 在C#中,主构造函数的实现通常如下所示: public class Person { public string Name { get; private set; } public...因此,应该在构造函数中捕获并处理可能发生的异常: public class Person { public string Name { get; private set; } public...主构造函数与性能 虽然主构造函数的主要职责是初始化对象,但在某些情况下,它也可能影响应用程序的性能。例如,如果构造函数执行了复杂的计算或访问了外部资源,这可能会降低对象创建的速度。

    4.8K00

    【《Effective C#》提炼总结】提高Unity中C#代码质量的21条准则

    《Effective C# Second Edition》一书原本有50条原则,但这50条原则是针对C#语言本身以及.NET来写的,我在阅读过程中,发现是有些原则并不适用于Unity中mono版本的C#...● 使用属性,可以非常轻松的在get和set代码段中加入检查机制。 需要注意,正因为属性是用方法实现的,所以它拥有方法所拥有的一切语言特性: 1)属性增加多线程的支持是非常方便的。...你可以加强 get 和 set 访问器(accessors)的实现来提供数据访问的同步。 2)属性可以被定义为virtual。 3)可以把属性扩展为abstract。...6)因为实现实现访问的方法get与set是独立的两个方法,在C# 2.0之后,你可以给它们定义不同的访问权限,来更好的控制类成员的可见性。...原则14 保证值类型的常量性和原子性 常量性的类型使得我们的代码更加易于维护。不要盲目地为类型中的每一个属性都创建get和set访问器。

    2.6K30

    Pro ASP.NET MVC –第五章 使用Razor「建议收藏」

    在MVC程序中Razor视图被编译成C#类,而其基类(RazorView)定义了一个Layout属性,我们在18章中我们将介绍更详细的内容。...为了最大化地利用MVC框架,你应该在程序中的各个部分重视并强制实现隔离。...同样地,你不应该在行为方法中格式化数据,然后将其传递给视图。相反地,应该让视图按照所需的方式呈现数据。...你应当记住,虽然MVC框架并没有要求正确使用MVC模式,但是我们还是应该在设计和编码时遵循MVC模式。 插入数据值 使用Razor表达能做的最简单的事情就是向标记语言中插入数据。...,你应该放置@符号在C#条件关键字前,在我们的例子中,就是在switch前放置@符号。

    4.1K20

    带你了解C#每个版本新特性

    在C#1中声明属性,属性中的get和set的访问级别是和属性一致,要么都是public要么都是private,如果要实现get和set有不同的访问级别,则需要用一种变通的方式,自己写GetXXX和SetXXX...在C#2中可以单独设置get和set的访问级别,如下: private string _name; public string Name { get { return _name; }...private set { _name = value; } } 需要注意的是,不能讲属性设置为私有的,而将其中的get或是set设置成公有的,也不能给set和get设置相同的访问级别,当set和get...怎样只让部分程序集访问,就要使用友元程序集了,具体参考之前的博文《C#:友元程序集(http://blog.fwhyy.com/2010/11/csharp-a-friend-assembly/)》 可空类型...静态类型中当我们要使用程序集中的类,要调用类中的方法,编译器必须知道程序集中有这个类,类里有这个方法,如果不能事先知道,编译时会报错,在C#4以前可以通过反射来解决这个问题。

    4.2K20

    Attacking SQL Server CLR Assemblies

    csc.exe编译器简单地将"c:tempcmd_exec.cs"编译为 DLL,即使您没有安装Visual Studio,csc.exe编译器也会默认附带.NET框架,所以它应该在你的Windows系统的某个地方...[cmd_exec]; GO 现在您应该能够通过"msdb"数据库中的"cmd_exec"存储过程执行操作系统命令,如下例所示 完成后,您可以使用下面的TSQL删除过程和程序集 DROP PROCEDURE...如果您之前没有使用过 PowerUpSQL,您可以访问此处的设置页面 我创建了一个名为"Create-SQLFileCLRDll"的PowerUpSQL函数来动态创建类似的DLL和TSQL脚本,它还支持用于设置自定义程序集名称...[object_id] 通过此查询我们可以看到文件名、程序集名称、程序集类名称、程序集方法以及该方法映射到的存储过程 您应该在结果中看到"my_assembly",如果您运行我之前提供的"Create-SQLFileCLRDll..."命令生成的10个TSQL查询,那么您还将看到这些程序集的相关程序集信息 PowerUpSQL自动化 我在PowerUpSQL中为此添加了一个名为"Get-SQLStoredProcedureCLR'的函数

    2.5K20

    Python3 与 C# 面向对象之~封装

    姓名:李四,年龄:22 1.4 私有属性、方法 C#、Java里面都是有访问修饰符的,Python呢?...,你通过set_age我就可以判断了哇,还是本宝宝聪明 这时候小潘过来了,淡淡的一笑,看我怎么破了你 ~ 看代码: zhangsan = Student("张三", -20) zhangsan.show...(和C#还是有很大区别的) ---- 1.7 类属性、实例属性 小明问老师:“老师老师,怎么没有静态类,静态属性之类的东西呢?”...(尽量别同名) 类属性除了可以通过 类名.类属性 访问外,还可以直接 实例对象.类属性 (C#中抽象类和静态类是不能被实例化的) 来个案例更直观点: class Person(object):...静态方法:定义静态方法使用装饰器 @staticmethod,没有默认的必须参数,通过类和实例直接调用 静态方法中不需要额外定义参数,因此在静态方法中引用类属性的话,必须通过 类对象来引用(访问) 小明眼花缭乱的对老师说道

    2.3K30

    Python3 与 C# 面向对象之~封装

    姓名:李四,年龄:22 1.4 私有属性、方法 C#、Java里面都是有访问修饰符的,Python呢?...,你通过set_age我就可以判断了哇,还是本宝宝聪明 这时候小潘过来了,淡淡的一笑,看我怎么破了你 ~ 看代码: zhangsan = Student("张三", -20)zhangsan.show(...C#还是有很大区别的) ---- 1.7 类属性、实例属性 小明问老师:“老师老师,怎么没有静态类,静态属性之类的东西呢?”...(尽量别同名) 类属性除了可以通过 类名.类属性 访问外,还可以直接 实例对象.类属性 (C#中抽象类和静态类是不能被实例化的) 来个案例更直观点: class Person(object):    #...        public string Name { get; set; }        ///        /// 自动属性必须要有get访问器

    1.9K30

    面向对象先导课感想

    收获和感想 作为一个虽然没有专门学过java但是早已经熟悉OOP程序设计方式,并使用 C# 有过大概几千行开发经验的学员,我的感想可能和大部分人有些不同。...而C#中则完全不需要这些,抛出异常无需声明,也可以随意的使用可能有异常的函数(方法)(不过由于乱抛异常导致的程序报错结果也得自己处理。)...可是很多时候还是需要这样子的变量的,尤其是频繁访问的数据,不停地 get, set总让人感到非常的不舒服,语法也会变得很臃肿。...而在C#中,则有个叫做属性的东西,可以很好的解决这一问题,就像这样 protected int p_val; public int val { get { return this.p_val...get, set内部本质还是一个函数,可以执行复杂任务的函数。

    91840

    .NET高级特性-Emit(2)类的定义

    废话不多说,首先,我们先来回顾一下C#类的内部由什么东西组成:   (1) 字段-C#类中保存数据的地方,由访问修饰符、类型和名称组成;   (2) 属性-C#类中特有的东西,由访问修饰符、类型、名称和...get/set访问器组成,属性的是用来控制类中字段数据的访问,以实现类的封装性;在Java当中写作getXXX()和setXXX(val),C#当中将其变成了属性这种语法糖;   (3) 方法-C#类中对逻辑进行操作的基本单元...接着,我们再观察C#类本身又具备哪些东西:   (1) 访问修饰符-实现对C#类的访问控制   (2) 继承-C#类可以继承一个父类,并需要实现父类当中所有抽象的方法以及选择实现父类的虚方法,还有就是子类需要调用父类的构造器以实现对象的创建...,类的内部包含构造器、方法、字段、属性以及它的get/set方法,由此,我们可以开始编写Emit代码了 三、Emit编写   有了以上的对C#类的解读和IL的解读,我们知道了C#类本身所需要哪些元素,我们就开始根据这些元素来开始编写..., Type.EmptyTypes);   (9) 编写Name属性的get/set访问器 //定义get方法 var getMethodBuilder = typeBuilder.DefineMethod

    1.4K20

    一文搞定泛型知识

    .items {get;set;} } 在上述代码中我们在类中显示实现了两个不同类型实参的同一个泛型接口,一般来说在类中多次实现泛型接口并非是一个最优的选择,因为它会造成代码的混淆以及在使用的过程中造成误会...因此除非特殊情况,绝大多数情况下我们不应该在一个类中多次实现同一个接口。...3.默认值 当我们需要在泛型类的构造函数中部分属性进行初始化,而其他属性不进行初始化,但是我们在开发中无法确定传入泛型类中的类型参数是什么,因此我们也无法通过具体的值设置默认值。...在这里我通过简单的几句来说一下约束继承。首先无论是泛型类型参数还是它们的约束都不会被 派生类 继承,这是因为泛型类型参数和约束不是类的成员。虽然不能被派生类继承,但是可以被从其派生的泛型类所继承。...六、总结 这篇文章我主要讲解了泛型的一些知识,不能说很全面,但已经覆盖了百分之九十的内容。泛型在开发中可以说是经常用到,良好的使用泛型可以提高代码复用率以及程序的运行性能。

    1.4K10

    精:C#这些年来受欢迎的特性

    任何编程中,你应该评估用例来确保善用工具。 C# 2.0 作为参考,我将列出C# 2.0 (ISO-2) 的所有特性。...匿名方法 协变和逆变 泛型 迭代器 可空类型 部分类型 我最在最喜欢 泛型 还是 迭代器 之间的摇摆,对我来说这是一个非常困难的选择,最终还是更喜欢泛型,顺便说说其中缘由。...因为相比于写迭代器,我更频繁地使用泛型。在 C# 中很多 SOLID 编程原则 都是使用泛型来强化的,同样它也有助于保持代码的 干爽 。...C# 3.0 下面是C#3.0的主要特性列表。 匿名类型 自动实现的属性 表达树 扩展方法 Lambda表达 查询表达式 我徘徊于选择 Lambda表达式 还是 扩展方法 。...而使用字符串插值时,可以防止运行时出错。 使用 $ 符号插入字符串文字时,将启用 C# 中的字符串插值语法。相当于告诉 C# 编译器,我们要用到各种 C# 变量、逻辑或表达式来插入到此字符串。

    83630

    C# 这些年来受欢迎的特性

    任何编程中,你应该评估用例来确保善用工具。 C# 2.0 作为参考,我将列出C# 2.0 (ISO-2) 的所有特性。...匿名方法 协变和逆变 泛型 迭代器 可空类型 部分类型 我最在最喜欢 泛型 还是 迭代器 之间的摇摆,对我来说这是一个非常困难的选择,最终还是更喜欢泛型,顺便说说其中缘由。...因为相比于写迭代器,我更频繁地使用泛型。在 C# 中很多 SOLID 编程原则 都是使用泛型来强化的,同样它也有助于保持代码的 干爽 。...C# 3.0 下面是C#3.0的主要特性列表。 匿名类型 自动实现的属性 表达树 扩展方法 Lambda表达 查询表达式 我徘徊于选择 Lambda表达式 还是 扩展方法 。...而使用字符串插值时,可以防止运行时出错。 使用 $ 符号插入字符串文字时,将启用 C# 中的字符串插值语法。相当于告诉 C# 编译器,我们要用到各种 C# 变量、逻辑或表达式来插入到此字符串。

    91120

    如何在 C# 9 中使用record类型?

    本文讨论了我们如何在 C# 9 中使用 init-only 属性和record类型。 要使用本文中提供的代码示例,您应该在系统中安装 Visual Studio 2019。...遵循这些步骤将在 Visual Studio 2019 中创建一个新的 .NET Core 控制台应用程序项目。我们将在本文的后续部分中使用该项目。...在 C# 9 中使用 init-only 属性 init-only属性是那些只能在对象初始化时赋值的属性。请参阅以下包含 init-only 属性的类。...dbMetadata.DbType = "SQL Server"; 在 C# 9 中使用record类型 C# 9 中的record类型是仅具有只读属性的轻量级、不可变数据类型(或轻量级类)。...; } } C# 9 中的位置record 默认情况下,使用位置参数创建的record类型实例是不可变的。

    2.5K10

    如何在 C# 9 中使用record类型?

    本文讨论了我们如何在 C# 9 中使用 init-only 属性和record类型。 要使用本文中提供的代码示例,您应该在系统中安装 Visual Studio 2019。...遵循这些步骤将在 Visual Studio 2019 中创建一个新的 .NET Core 控制台应用程序项目。我们将在本文的后续部分中使用该项目。...在 C# 9 中使用 init-only 属性 init-only属性是那些只能在对象初始化时赋值的属性。请参阅以下包含 init-only 属性的类。...dbMetadata.DbType = "SQL Server"; 在 C# 9 中使用record类型 C# 9 中的record类型是仅具有只读属性的轻量级、不可变数据类型(或轻量级类)。...; } } C# 9 中的位置record 默认情况下,使用位置参数创建的record类型实例是不可变的。

    3K20

    C# 消息队列之RabbitMQ

    动态库 准备工作 首先,我们访问官网【https://www.rabbitmq.com/】,点击Get Started。...随手百度一下,原来他是一个软件包管理工具,也就是说,Chocolatey是类似于Nuget的一种工具。 由于Chocolatey的使用,我不是很熟悉,所以,这里选择使用官方安装包安装。...下载完成得到如下图文件: PS:这里下载的是OTP的22.1的版本,我的理解是Erlang等于C#语言,而OTP等于NetFramework。...C#里使用RabbitMQ开源类库非常简单,可以去官网下载一个.NET版本的RabbitMQ客户端类库,也可以直接在Nuget上搜索RabbitMQ,然后安装,如下图: 到此,RabbitMQ服务端的环境配置好了...,正常情况,这些配置应该在服务器进行,但我为了测试方便,就把服务端也安装在本机了,因此我下面调用RabbitMQ时,连接的主机IP都是localhost。

    98510

    再来说说我喜欢的 Dotnet 5.0 & C# 9

    上次写完 C# 10,有兄弟在后台问 C# 9,就再开个篇写一写。 C# 9,对应的是 Dotnet 5.0。 这个出来也有些日子了,不过好像群里很多人还是没往这个版本走。...我这边现在是全线已经转向了 5.0,还是我经常说的那个原因:爽。Dotnet 的每一次升级,都有一些让人惊喜的特性,让代码更合理,更节省时间。 1....不过在使用中,我更喜欢用它来做数据传输。 定义一个 Record 定义一个 Record 有几种方式。...再来看看另一种定义方式,会更像一个类: public record User { public string name { get; set; } public int age { get; set...以上是 C# 9 中增加的最重要的一个内容:Record 类型。 2. API 方面 API 方面,主要是三个特性。 1. 顶级程序 这算是大家盼了很久的一个特性。

    51320

    C# 数据操作系列 - 3. ADO.NET 离线查询

    前言 在上一篇中,我故意留下了查询的示范没讲。...离线查询 C#在查询上提供了另一种机制,可以一次性从数据库把结果读取到网络缓存区中,直到使用的时候才加载到程序中。...里 在C#内部,其实不允许推荐直接继承该接口,推荐继承DataAdapter类,该类规定了数据库Adapter在初始化的时候,必须提供一个可以访问的数据库连接和要执行的命令文本。...,并把数据填充进去: DataSet set = new DataSet(); adapter.Fill(set); 然后可以看到这个set中的数据应该是这样的: ?...这样一来,显然就比直接使用IDataReader访问数据要方便很多。 依据上例: 我们试着获取一下第三行的Province列值,如果觉得这个表述别扭的话,看一下我的写法,就知道我为什么这么表示了。

    2.3K20

    C++程序员转向C#时的十大陷阱

    在那篇文章里,我说过C#和C++的语法很象,转移过程中的困难并非来自语言自身,而是对受管制的.NET环境的适应和对庞大的.NET框架的理解。...因为使用终结器要付出代价,所以,你只应该在需要的方法上实现(也就是说,在使用代价昂贵的、未受管制的资源的方法上实现)。...,我在另一篇译文(A Comparative Overview of C#中文版(上篇))里有更精彩的描述J】 陷阱5.C#中结构是大不相同的 C++中的结构几乎和类差不多。...不管是C++还是C#都没招L 】 【译注:C++程序员一般是喜欢这种自由的写法: if (MyRef) if (MyInt) 但在C#里,必须写成: if (MyRef == null)//或if (null...switch的完整例子,它还说明了switch语句支配的类型可以是字符串,并演示了属性的使用方法。

    2.7K10
    领券