iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#中的属性解析(get、set、value)
  • 127
分享到

C#中的属性解析(get、set、value)

2024-04-02 19:04:59 127人浏览 独家记忆
摘要

目录C#中的属性(get、set、value)C#中属性的定义C#中的属性(get、set、value) C#语言在面向对象设计和编程中对数据安全提出了严格的要求,其中一个重要的原则

C#中的属性(get、set、value)

C#语言在面向对象设计和编程中对数据安全提出了严格的要求,其中一个重要的原则就是数据封装。根据这一原则,C#程序设计中要求开发人员对特定类的数据字段尽量不以公有方式提供给外界。因此在类内部多数字段的访问权限被限定为private或是public,而这些字段与外界的交流经常采用属性来进行。

属性使类能够以一种公开的方法获取和设置值,同时隐藏实现或验证代码。

属性是这样的成员:它们提供灵活的机制来读取、编写或计算私有字段的值。

可以像使用公共数据成员一样使用属性,但实际上它们是称作“访问器”的特殊方法。这 使得可以轻松访问数据,此外还有助于提高方法的安全性和灵活性。

属性使类能够以一种公开的方法获取和设置值,同时隐藏实现或验证代码。

get 属性访问器用于返回属性值,而 set 访问器用于分配新值。 这些访问器可以有不同的访问级别。

get 访问器体与方法体相似。 它必须返回属性类型的值。执行 get 访问器相当于读取字段的值

get 访问器必须以 return 或 throw 语句终止,并且控制权不能离开访问器体。

value 关键字用于定义由 set 取值函数分配的值。

不实现 set 取值函数的属性是只读的。

属性的定义通常由以下两部分组成:

1、需要封装的专用数据成员

private int _nValue = 1;
private double _dValue = 10.101;
private char _chValue = 'a';

2、向外界提供访问的公共属性:

//读写属性nValue:
public int nValue
{
    get
    {
        return _nValue;
    }
    set
    {
        _nValue = value;
    }   
}
//只读属性dValue:
public double dValue
{
    get
    {
        return _dValue;
    }
}
//只写属性chValue:
public char chValue
{
    set
    {
        _chValue = value;
    }
}

当属性的访问器中不需要其他逻辑时,自动实现的属性可使属性声明更加简洁。客户端还可以通过这些属性创建对象,例如下面的代码,编译器将创建一个私有的匿名支持字段,该字段只能通过属性的get和set访问器进行访问。

class Customer
{   // Auto-Impl Properties for trivial get and set
    public double TotalPurchases { get; set; }
    public string Name { get; set; }
    public int CustomerID { get; set; }
    // Constructor
    public Customer(double purchases, string name, int ID)
    {
        TotalPurchases = purchases;
        Name = name;
        CustomerID = ID;
    }
    // Methods
    public string GetContactInfo() {return "ContactInfo";}
    public string GetTransactionHistory() {return "History";}
    // .. Additional methods, events, etc.
}
class Program
{
    static void Main()
    {
        // Intialize a new object.
        Customer cust1 = new Customer ( 4987.63, "Northwind",90108 );
        //Modify a property
        cust1.TotalPurchases += 499.99;
    }
}

下面讲一个如何使用自动实现的属性实现轻量类:

此示例演示如何创建一个不可变轻量类,用于仅封装一组自动实现的属性。当您必须使用引用类型语义时,请使用此种构造而不是结构。

请注意:对于自动实现的属性,需要 get 和 set 访问器。 要使该类不可变,请将 set 访问器声明为 private。 但是,声明私有 set 访问器时,不能使用对象初始值来初始化属性。

下面的示例演示两种方法来实现具有自动实现属性的不可变类。第一个类使用构造函数初始化属性,第二个类使用静态工厂方法。

class Contact
      {
          // Read-only properties.
          public string Name { get; private set; }
          public string Address { get; private set; }
          // Public constructor.
          public Contact(string contactName, string contactAddress)
          {
              Name = contactName;
              Address = contactAddress;               
          }
      }
      // This class is immutable. After an object is created,
      // it cannot be modified from outside the class. It uses a
      // static method and private constructor to initialize its properties.   
      public class Contact2
      {
          // Read-only properties.
          public string Name { get; private set; }
          public string Address { get; private set; }
          // Private constructor.
          private Contact2(string contactName, string contactAddress)
          {
              Name = contactName;
              Address = contactAddress;               
          }
          // Public factory method.
          public static Contact2 CreateContact(string name, string address)
          {
              return new Contact2(name, address);
          }
      }
      public class Program
      { 
          static void Main()
          {
              // Some simple data sources.
              string[] names = {"Terry Adams","Fadi Fakhouri", "Hanying Feng", 
                                "Cesar Garcia", "Debra Garcia"};
              string[] addresses = {"123 Main St.", "345 Cypress Ave.", "678 1st Ave",
                                    "12 108th St.", "89 E. 42nd St."};
              // Simple query to demonstrate object creation in select clause.
              // Create Contact objects by using a constructor.
              var query1 = from i in Enumerable.Range(0, 5)
                          select new Contact(names[i], addresses[i]);
              // List elements cannot be modified by client code.
              var list = query1.ToList();
              foreach (var contact in list)
              {
                  Console.WriteLine("{0}, {1}", contact.Name, contact.Address);
              }
              // Create Contact2 objects by using a static factory method.
              var query2 = from i in Enumerable.Range(0, 5)
                           select Contact2.CreateContact(names[i], addresses[i]);
              // Console output is identical to query1.
              var list2 = query2.ToList();
              // List elements cannot be modified by client code.
              // CS0272:
              // list2[0].Name = "Eugene Zabokritski"; 
              // Keep the console open in debug mode.
              Console.WriteLine("Press any key to exit.");
              Console.ReadKey();                
          }
      }
  

上诉中,通过get存取器和set存取器将封装好的专有数据成员和共同属性关联起来。

此时,value关键字是时候出场了。

在普通的C#程序中,一般不能通过常用的调试手段获得value值传递的详细过程,不能像c++中一样跟踪指针的变化情况。当使用如下语句给属性赋值:

Class ValueCollector{...};
ValueCollector newValue = new ValueCollector();
newValue.nValue = 10;

新对象newValue的私有数据成员_nValue通过属性nValue的set方法由原来的1改变为10;

赋值语句的右值通过隐式参数value进入属性set方法内,成功改变整型私有变量的值。

在这一过程中,value参数的类型是整型,与属性的类型是一致的。当属性的类型改变为char,value参数的属性也相应的改变为字符型。

这种参数类型的自动转换时基于.netFramework提供的类型转换器而实现的,CLR将C#源代码编译成中间语言IL,在这种类汇编的高级机器语言中可以发现value参数的传递机制。

C#中属性的定义

属性的定义

定义结构:

public int MyIntProp{
    get{
            //get code
        }
    set{
            //set code
        }
    }
  • 定义属性需要名字和类型。
  • 属性包含两个块:get块和set块。
  • 访问属性和访问字段一样,当取得属性的值得时候,就会调用属性中的get块,因此get块需要返回值,其返回值类型就是属性的类型;当我们去给属性设置值得时候,就会调用属性中的set块,以此可以在set块中通过value访问到我们所设置的值。

eg:

//跟访问字段的方式一样
v1.MyIntProperty = 600; //对属性设置值,自动调用set块
int temp = v1.MyIntProperty //对属性取值,自动调用get块

需要注意的是,set方法和get方法可以不同时存在。

但是如果没有get块,就不可以获得取值;如果没有set块,就不能进行设置值。

通过属性访问字段

一般而言,习惯于将字段设置为private,这样外界就不能修改字段的值。这是我们可以通过定义属性来设置字段和获取字段的值。

eg:

private int age;
public int Age{ //习惯字段小写,属性大写
    set{
        if(value<0) return;   //通过set值进行一些校验的工作
        age = value;
        }
    get{
        return age;
        }
    }

设置属性的只读或者只写

只读

private string name;
public string Name{
    get{
            return name;
        }

只写

private string name;
public string Name{
    set{
            name = value;
        }

属性的访问修饰符

//如果在get或set块钱加上private,表示这个块只能在类内进行调用
public float X{
    private set { x = value;}  
    get { return x;}
public float X{
    set { x = value;}  
    private  get { return x;}  

自动实现的属性

public int Age{set;get;}    //编译器会自动提供字段来存储age
-->等价于
public int Age{
    set{ age = value;}
    get{ return age;}

总结一下,属性就相当于是一种带有set和get方法的一个方法,而它与类中的字段的赋值和取值又是息息相关的。 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。 

--结束END--

本文标题: C#中的属性解析(get、set、value)

本文链接: https://www.lsjlt.com/news/166050.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#中的属性解析(get、set、value)
    目录C#中的属性(get、set、value)C#中属性的定义C#中的属性(get、set、value) C#语言在面向对象设计和编程中对数据安全提出了严格的要求,其中一个重要的原则...
    99+
    2024-04-02
  • c++中get和set的用法
    get() 方法用于获取对象成员变量的值,而 set() 方法用于设置对象成员变量的值。get() 方法的语法为:t get() const; set() 方法的语法为:void set...
    99+
    2024-05-01
    c++
  • C#中关键字get、set、value、partial、where和yield怎么用
    这篇文章主要介绍C#中关键字get、set、value、partial、where和yield怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!C#关键字——get、set、valueget 在属性或索引...
    99+
    2023-06-17
  • C#中{get;set;}的具体使用
    在C#程序中经常会看到set,get的配套使用,很多人不知道它的用途。我就在这向大家讲讲,也加深一下自己的印象。 //这里有两个类 public class person1 { ...
    99+
    2023-02-06
    C# {get;set;} C# GET SET
  • 解读input标签的value属性及name属性
    目录input标签的value属性input标签的name属性总结input标签的value属性 input 标签的 value 属性的作用是由 input 标签的 type 属性的...
    99+
    2023-01-09
    input标签属性 input标签的value属性 input value属性
  • VBS中Value属性的用法
    本篇内容主要讲解“VBS中Value属性的用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“VBS中Value属性的用法”吧!Value 属性返回在一个搜索字符串中找到的匹配的值或文本。obje...
    99+
    2023-06-08
  • C#中属性和特性的示例分析
    这篇文章主要介绍C#中属性和特性的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!首先要说的是,可能一些刚接触C#的朋友常常容易把属性(Property)跟特性(Attribute)弄混淆,其实这是两种不同的东...
    99+
    2023-06-17
  • vuex中的state属性解析
    目录state属性介绍state的使用扩展vuex的State单一状态树在Vue组件中获得 Vuex 状态mapState辅助函数state属性介绍 state属性是Vuex中用于存...
    99+
    2024-04-02
  • 浅谈@FeignClient中name和value属性的区别
    目录name和value属性的区别name和url属性的作用定义场景解释name和value属性的区别 从源码可以得知,name是value的别名,value也是name的别名。 ...
    99+
    2024-04-02
  • Vue中监视属性和计算属性区别解析
    目录计算属性需求使用watch实现准备工作测试测试在computed当中书写总结计算属性 顾名思义,计算属性就是计算出来的属性,英文名儿computed这里要和data和method...
    99+
    2022-11-13
    vue监视属性 vue计算属性
  • c++中set的用法详解
    c++kquote>set 是一种存储不重复且有序元素的容器,元素的顺序由比较函数决定。创建 set 使用 set 语法,插入元素用 insert() 方法,查找元素用 find(...
    99+
    2024-05-01
    c++
  • Spring注解@Value及属性加载配置文件方式的示例分析
    这篇文章主要介绍了Spring注解@Value及属性加载配置文件方式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Spring中使用@Value注解给bean加载属...
    99+
    2023-06-20
  • 分析mybatis中@Mapper注解的componentModel属性
    本篇内容主要讲解“分析mybatis中@Mapper注解的componentModel属性”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“分析mybatis中@M...
    99+
    2024-04-02
  • C#中属性(Attribute)的用法
    一、创建属性 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor, AllowMultiple...
    99+
    2024-04-02
  • C#中属性PropertyInfo的使用
    在C#中,PropertyInfo类用于访问和操作属性的信息。下面是PropertyInfo类常用的方法和属性的使用:1. Name...
    99+
    2023-09-12
    C#
  • H5中position属性的使用技巧解析
    掌握H5中position属性的使用技巧,需要具体代码示例H5是一种用于网页设计和开发的标记语言,其中的position属性是控制元素定位的重要属性之一。在本篇文章中,我们将讨论position属性的几种常见使用技巧,并提供具体的代码示例。...
    99+
    2023-12-27
    使用技巧 H position属性
  • 详解Spring通过@Value注解注入属性的几种方式
    场景假如有以下属性文件dev.properties, 需要注入下面的tagtag=123通过PropertyPlaceholderConfigurer<bean class="org.springframework.beans.fac...
    99+
    2023-05-31
    spring value 注解
  • 解决@Value注解不能注入static修饰的属性问题
    目录@Value注解不能注入static属性问题描述剖析@Value(“${属性}“)注入被static修饰的属性问题描述解决方案@Value注解不能注入st...
    99+
    2024-04-02
  • Spring中如何使用@Value注解实现给Bean属性赋值
    目录属性赋值@Value注解的定义:测试1.在添加了Spring依赖的Maven项目中创建2.在resources目录下创建一个配置文件person.properties3.创建配置...
    99+
    2024-04-02
  • 利用@Value注解为bean的属性赋值方法总结
    目录1.@Value注解2.@Value注解的用法2.1.不通过配置文件注入属性的情况2.2.通过配置文件注入属性的情况2.3.@Value中#{··&m...
    99+
    2023-05-19
    @Value注解为bean的属性赋值 @Value为bean属性赋值 @Value bean
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作