首页 > 编程语言 >C# 字段 属性 方法 构造函数 索引器 事件 嵌套类型 常量 运算符重载

C# 字段 属性 方法 构造函数 索引器 事件 嵌套类型 常量 运算符重载

时间:2024-06-11 15:04:53浏览次数:31  
标签:set 索引 C# get 运算符 访问 构造函数 public 属性

字段

众嗦粥汁,字段又叫成员变量
C#中,字段(Fields)是类的成员,用于存储数据。字段可以是任何数据类型,包括基本数据类型(如 int, double, bool 等)和引用类型(如类、数组等)。字段可以是静态的static(属于类的,而不是类的实例)或实例的(属于类的对象)。

以下是一些关于C#字段的关键点:

声明字段

字段是在类中声明的,并且可以有访问修饰符(如 public, private, protected, internal 等)来指定其可访问性。

public class Person
{
    public string Name; // 公共字段
    private int age;    // 私有字段
    protected bool isStudent; // 受保护的字段,只能在此类及其派生类中访问
}

字段初始化

字段可以在声明时初始化,也可以在构造函数中初始化。

public class Person
{
    public string Name = "Unknown"; // 字段初始化
    public int Age { get; set; } // 自动属性,具有默认值0

    public Person(string name, int age)
    {
        Name = name;
        Age = age; // 构造函数中初始化
    }
}

静态字段

静态字段属于类本身,而不是类的任何特定实例。它们使用 static 关键字声明。

public class School
{
    public static int StudentCount = 0; // 静态字段

    public School()
    {
        StudentCount++; // 增加学生计数
    }
}

常量字段

使用 const 关键字声明的字段是常量,它们的值在编译时已知,并且在运行时不能更改。

public class Constants
{
    public const double Pi = 3.14159; // 常量字段
}

只读字段

只读字段使用 readonly 关键字声明,它们可以在声明时或构造函数中初始化,但之后不能被修改。

public class Product
{
    public readonly string ProductCode; // 只读字段

    public Product(string code)
    {
        ProductCode = code;
    }
}

字段的访问

字段可以通过对象实例访问(对于实例字段)或直接通过类名访问(对于静态字段)。

Person person = new Person();
person.Name = "Alice"; // 访问实例字段

School.StudentCount = 10; // 访问静态字段

字段是类定义中最基本的数据存储单元,它们提供了一种简单的方式来存储和操作数据。

然而

为了封装和数据保护,通常建议使用属性(Properties)而不是直接访问字段。属性提供了一种更灵活的方式来控制对字段的访问,并且可以在访问或设置值时添加额外的逻辑。


属性

C#中,属性(Properties)是一种成员,它们提供了一种访问和设置字段值的方法,同时允许你添加逻辑来验证或处理这些值。属性可以被视为字段的替代品,但它们提供了更多的控制和灵活性。

属性通常包含两个部分:get 访问器和 set 访问器。get 访问器返回属性的值,而 set 访问器设置属性的值。属性可以是只读或只写,也可以是读写的。

以下是一些关于C#属性的关键点:

声明属性

属性使用 getset 块声明,它们定义了如何获取和设置属性值。

public class Person
{
    private string _name; // 私有字段,用于存储属性值

    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }
}

自动实现的属性

C# 允许你使用自动实现的属性,这样编译器会自动生成一个私有字段来存储属性的值。

public class Person
{
    public string Name { get; set; }
}

只读属性

如果只需要 get 访问器,属性可以是只读的。

public class Person
{
    public string Name { get; }
}

只写属性

如果只需要 set 访问器,属性可以是只写的。

public class Person
{
    private string _name;
    public string Name
    {
        set { _name = value; }
    }
}

属性的逻辑处理

可以在 set 访问器中添加逻辑,比如验证输入值。

public class Product
{
    private decimal _price;

    public decimal Price
    {
        get { return _price; }
        set
        {
            if (value < 0)
                throw new ArgumentOutOfRangeException("价格不能为负数。");
            _price = value;
        }
    }
}

属性的访问修饰符

属性的 getset 访问器可以有不同的访问修饰符,以控制它们的可见性。

public class Product
{
    public decimal Price
    {
        private get { return _price; }
        protected set { _price = value; }
    }
}

属性和字段的区别

属性允许你控制对数据的访问,而字段是直接的数据存储。属性通常用于封装字段,提供数据验证或逻辑处理。

属性的用途

属性通常用于封装数据,提供数据验证,以及实现数据绑定等。

总结

属性是C#中非常重要的特性,它们提供了一种安全和灵活的方式来访问和修改对象的状态。通过使用属性,你可以隐藏实现细节,同时提供对数据的控制。


索引器

C#中,索引器(Indexers)是一种特殊的属性,它允许你使用数组索引的语法来访问对象的元素。索引器可以有多个参数,这使得它们非常适合用来实现类似字典或数据库表的访问模式。

索引器的基本语法

public class MyClass
{
    private Dictionary<int, string> _data = new Dictionary<int, string>();

    // 索引器声明
    public string this[int index]
    {
        get
        {
            if (_data.TryGetValue(index, out string value))
                return value;
            else
                throw new KeyNotFoundException("索引未找到。");
        }
        set
        {
            _data[index] = value;
        }
    }
}

使用索引器

class Program
{
    static void Main()
    {
        MyClass myObj = new MyClass();

        // 使用索引器设置元素
        myObj[1] = "Hello";
        myObj[2] = "World";

        // 使用索引器获取元素
        Console.WriteLine(myObj[1]); // 输出: Hello
        Console.WriteLine(myObj[2]); // 输出: World

        try
        {
            // 尝试访问不存在的索引
            Console.WriteLine(myObj[3]);
        }
        catch (KeyNotFoundException ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

索引器的关键点

语法

索引器的语法与属性类似,但使用了 this 关键字,后面跟着参数列表。

参数

索引器可以有一个或多个参数,这些参数用于确定要访问或设置的元素。

访问和设置

索引器可以有 getset 访问器,允许你获取和设置元素的值。

异常处理

get 访问器中,如果尝试访问不存在的索引,可以抛出异常,如 KeyNotFoundException

性能

使用索引器可以提供快速的数据访问,特别是当你使用内部数据结构(如字典)来存储元素时。

重载

你可以为同一个类定义多个索引器,只要它们的参数列表不同。

使用场景

索引器非常适合实现类似数组或字典的数据结构,允许用户通过索引来访问和修改数据。

封装

索引器可以封装内部数据结构,隐藏实现细节,只暴露必要的接口给用户。

总结

索引器是C#中一个强大的特性,它提供了一种自然和直观的方式来访问和操作对象的元素。通过使用索引器,你可以创建更加灵活和强大的数据结构。

标签:set,索引,C#,get,运算符,访问,构造函数,public,属性
From: https://blog.csdn.net/m0_50859743/article/details/139594048

相关文章

  • AcWing 655 天数转换
    读取对应于一个人的年龄(以天为单位)的整数值,并转化为年,月和日表示方式输出,年、月、日分别对应ano(s),mes(es),dia(s)。注意:为了方便计算,假设全年365天,每月30天。数据保证,不会出现12个月和几天的情况,例如360,363或364。输入格式输入一个整数N。输出格式参照输......
  • Pytorch 实现简单的 线性回归 算法
    Pytorch实现简单的线性回归算法简单tensor的运算Pytorch涉及的基本数据类型是tensor(张量)和Autograd(自动微分变量)importtorchx=torch.rand(5,3)#产生一个5*3的tensor,在[0,1)之间随机取值y=torch.ones(5,3)#产生一个5*3的Tensor,元素都是1z=x+y......
  • Tomcat部署及优化
    目录一、Tomcat 1、tomca简介2、tomcat核心组件 3、Servlet是什么4、什么是JSP 5、tomcat功能组件结构5.1、Container结构分析:5.2、tomcat的请求过程2、Tomcat部署(1)安装jdk1)系统初始化2)安装jdk (2)安装并启动Tomcat1)上传压缩包并解压 2)开启tomcat 3)关......
  • 下载docker镜像并推送至阿里云镜像服务
    脚本地址https://gitee.com/shenglx/docker_image_push_aliyun 主要思路是在可以访问docker的服务器上通过脚本将镜像推送到阿里镜像服务,怎么访问购买海外服务器或者通过别的方式开通阿里云容器镜像服务(个人版即可) https://cr.console.aliyun.com/下载docker_psuh.sh文件......
  • centos7 安装ORACLE 11.2.0.4.0 RAC
    环境:oraclelinux7.7,安装系统时需双网卡,接心跳线。节点一(rac1):网卡一:10.121.116.91网卡二:192.168.1.101节点二(rac2):网卡一:10.121.116.92网卡二:192.168.1.103关闭防火墙systemctlstopfirewalldsystemctldisablefirewalld1.挂载镜像,配置本地......
  • 开源无代码 / 低代码平台 NocoBase 1.0.1-alpha.1: 区块支持高度设置
    NocoBase是一个极易扩展的开源无代码开发平台。完全掌控,无限扩展,助力你的开发团队快速响应变化,显著降低成本,不必投入几年时间和数百万资金研发,只需要花几分钟部署NocoBase。NocoBase中文官网官方文档在线Demo新特性区块支持高度设置(#4441)参考文档:区块高度链接操作:......
  • FFmpeg结构体:AVIOContext
    1.描述AVIOContext是FFmpeg管理输入输出数据的结构体,位于avio.h文件中。2.结构体定义1typedefstructAVIOContext{2/**3*Aclassforprivateoptions.4*5*IfthisAVIOContextiscreatedbyavio_open2(),av_classissetand......
  • [HITCON 2017]SSRFme
    [HITCON2017]SSRFme打开环境就是代码审计<?phpif(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){$http_x_headers=explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);$_SERVER['REMOTE_ADDR']=$http_x_headers[......
  • 关于namespace
    namespace和cgroup被称为当下轻量虚拟化技术的核心。namespace实现资源隔离。cgroup实现资源限制,主要是针对cpu和mem。那linux系统下namespace是如何实现资源隔离的呢?具体都隔离了哪些方面?资源类型提到资源隔离,所包含的资源类型包括:cpu内存网络存储空间进程和上下文环境......
  • CTFHUB技能树之WEB前置技能HTTP协议
    CTFHUB技能树WEB前置技能/HTTP协议请求方式根据提示可知,通过修改请求方式获取flag使用BurpSuite进行拦截,将GET方法改为CTFHUB方法即可。得到flag。302跳转打开BurpSuite进行拦截,将第一次请求发给重发器再次发送,得出flagCookie打开页面,得出提示信息,需要admin,将Cook......