美文网首页dotNET
C# Learning:使用属性替换公共字段

C# Learning:使用属性替换公共字段

作者: 月银秋 | 来源:发表于2020-08-09 15:19 被阅读0次

首先,我要解释的不是用属性封装字段来确保字段值正确,而是很单纯的,将如下代码:

public class MyClass
{
    public string Text;
}

修改为:

public class MyClass
{
    public string Text { get; set; }
}

没有添加任何的逻辑,只是要求:使用属性替换公共字段。
关于这个问题,网上其实能查到很多说法。但都说得太抽象了,所以我想在此另作一番解释。
首先我们要确认:属性和字段是不同的,不但是在定义、实现的时候不同,使用的时候也是不同的。可能有人要问了,明明语法是完全一样的,即:

var instance = new MyClass();

instance.Text = "Hello world!";
Console.WriteLine(instance.Text);

无论是字段或是属性,都可以使用这样的代码进行调用,且结果是毫无区别的。那么为什么我说是不同的呢?
先创建一个类库,并且将MyClass写到这个类库中。于是两个版本的MyClass可以生成出两个*.dll文件。为了区分,我们将使用字段的称为A、使用属性的称为B。随后创建一个控制台项目C,引用A,将调用的代码写入主方法,编译运行,其会正常输出:

Hello world!

于是我们知道,此*.exe可以正常调用A,那么如果我们直接将B换掉A,会发生什么?(注意不是引用B重新编译,而是直接把*.exe同目录的*.dll换掉)我们可以发现,无法正常运行:

未经处理的异常:  System.MissingFieldException: 找不到字段:“MyClassLibrary.MyClass.Text”。
   在 MyConsoleApp.Program.Main()

可以发现,它希望找一个字段,而不会去找属性。属性换为字段也同理( 不过出现的异常会是找不到方法)。
所以我们可以知道,对于调用方,字段与属性虽然语法完全一致,但其实编译后结果是不一样的。
那么回到原题,为什么要使用属性呢?
假如你的首个版本只希望储存到内存中,此时你随意可以选择使用属性或是字段。然而谁知道下个版本会发生什么呢?假如你下个版本打算储存到数据库中,那么你将只能使用属性。
在这种情况下,如果你首个版本中使用的是字段,就要发生字段向属性的转变,此时所有的项目都要重新编译。而如果你的类库还允许别人的项目来使用,所有使用你类库的人都需要发布新的版本。

相关文章

  • C# Learning:使用属性替换公共字段

    首先,我要解释的不是用属性封装字段来确保字段值正确,而是很单纯的,将如下代码: 修改为: 没有添加任何的逻辑,只是...

  • tolua中的属性访问

    C#中的属性转换为用lua访问时,是被当作字段使用的用Get+属性名ClientDataProxy.Instanc...

  • C# 属性与字段 Day0815

    公共字段只是类用public修饰符所公开的简单公共变量, 而属性则是对字段的封装,它使用get和set访问器来控制...

  • C#中abstract的用法详解

    C#中abstract的用法详解 abstract可以用来修饰类,方法,属性,索引器和时间,这里不包括字段. 使用...

  • 属性 数据类型 方法参数

    属性 属性是这样的成员:它提供灵活的机制来读取、编写或计算某个私有字段的值。 可以像使用公共数据成员一样使用属性,...

  • 2019-11-15 linux的替换:sed -i "s/查找

    sed -i "s/查找字段/替换字段/g" 例如:test.txt包括: a;bc;d 使用命令把;替换成换行符...

  • 面向对象-概念理解

    继承 继承的概念 类的公共属性【字段,方法】 .把公共的属性提取出来形成一个公共的类,让其他的类去继承:减少代码的...

  • python3 替换列表中的元素

    方法一:多种异常字段替换成一种字段 方法二:多字段替换

  • C#

    虚方法 1.方法替换---在子类中重新实现父类中定义的方法。 2.只有方法和属性是虚,字段不能是虚。 多态 使用父...

  • MYSQL JSON值查询

    mysql根据json字段的内容检索查询数据 使用 字段->'$.json属性'进行查询条件 使用json_ext...

网友评论

    本文标题:C# Learning:使用属性替换公共字段

    本文链接:https://www.haomeiwen.com/subject/edvldktx.html