当前位置: 首页 > news >正文

【C# Programming】类、构造器、静态成员

一、类

1、类的概念

  • 类是现实世界概念的抽象:封装、继承、多态
  • 数据成员: 类中存储数据的变量
  • 成员方法: 类中操纵数据成员的函数称为成员方法
  • 对象:类的实例
  • 类定义
class X {…}      var instance = new X(…);

2、实例字段

        C#中,数据成员称为字段。与具体对象相关的字段称为实例字段;实例字段允许在声明时初始化,初始化语句在类构造函数前执行, 例如:

class Employee
{public string FirstName;public string LastName;public string Salary = "Not enough";public Employee() { Salray= string.Empty;} 
}

        实例字段只能从对象中访问,例如:

public static void Main()
{Employee employee1 = new Employee();Employee employee2;employee2 = new Employee();employee1.FirstName = "Inigo";employee1.LastName = "Montoya";employee1.Salary = "Too Little";IncreaseSalary(employee1);Console.WriteLine(  "{0} {1}: {2}",employee1.FirstName, employee1.LastName,employee1.Salary);
}
static void IncreaseSalary(Employee employee)
{employee.Salary = "Enough to survive on";
}

        C#中,  只能通过对象调用的成员方法称为实例方法。

        在类的实例成员内部,可以使用this 获得调用实例成员的对象引用,例如:

class Employee
{public string FirstName;public string LastName;public string Salary;public string GetName(){return $"{ FirstName }  { LastName }";}public void SetName(string newFirstName, string newLastName) {this.FirstName = newFirstName;this.LastName = newLastName;}
}

        this关键字也能用来显式调用实例方法 或在方法调用中传递 ,例如:

class Employee
{public string FirstName;public string LastName;public string Salary;public string GetName() => $"{ FirstName }  { LastName }";public void SetName(string newFirstName, string newLastName){this.FirstName = newFirstName;this.LastName = newLastName;Console.WriteLine( $"Name changed to '{ this.GetName() }'");}public void Save(){DataStorage.Store(this);}
}
class DataStorage
{// Save an employee object to a file named with the Employee name.public static void Store(Employee employee) { ...}
}

3、访问修饰符

访问修饰符标识了所修饰成员的封装级别。

  • public:类或成员修饰符;表明类或成员可以从类外部访问
  • private:成员修饰符; 表明修饰的成员仅在声明的类内部访问
  • protected:成员修饰符; 表明修饰的成员仅在声明的类或派生类内部访问
  • internal:类或成员修饰符;表明类或成员仅能在相同程序集内部访问
  • Protected internal:类或成员修饰符;表明类或成员仅能在当前程序集内部或派生类访问
class Employee
{public string FirstName, LastName,Salary, Password;private bool IsAuthenticated;public bool Logon(string password) {if (Password == password)IsAuthenticated = true;return IsAuthenticated;}public bool GetIsAuthenticated() => IsAuthenticated;// ...
}

4、方法的参数

        类型缺省访问级别:

Members ofDefault member accessibilityAllowed declared accessibility of the member
enumpublicNone
classprivate

public

protected

internal

private

protected internal

interfacepublicNone
structprivate

public

internal

private

5、属性

        属性结合了字段和成员方法的特点。 对于对象的用户来说,属性似乎是一个字段,访问属性使用与访问字段 相同的语法。 对于类的实现者来说,属性是由 get 访问器和/或 set 访问器组成代码块。读取属性时,执行 get 访问器的代码块;向属性赋值时,执行 set 访问器的代码块。

        不含 set 访问器的属性称为只读属性。 将不含 get 访问器的属性称为只写属性。同时具有以上两个访问器的属性称为读写属性。  

        与字段不同,属性不会被归类为变量。 因此,不能将属性作为 ref 或 out 参数传递。

6、自动实现属性

        在 C# 3.0及更高版本,当属性访问器中不需要任何其他逻辑时,自动实现的属性会使属性声明更加简洁。在 C# 6和更高版本中,可以像字段一样初始化自动实现属性。

public static void Main()
{Employee employee1 = new Employee();Employee employee2 = new Employee();employee1.FirstName = "Inigo";    // Call the FirstName property's setter.System.Console.WriteLine(employee1.FirstName);    // Call the FirstName property's getter.// Assign an auto-implemented propertyemployee2.Title = "Computer Nerd";employee1.Manager = employee2;// Print employee1's manager's title.System.Console.WriteLine(employee1.Manager.Title);
}
class Employee
{public string FirstName { get; set; }private string LastName { get; set; }public string Title { get; set; }public Employee Manager { get; set; }public string Salary { get; set; } = "Not Enough";
}

7、属性的访问限制

        缺省情况下,get /set 访问器具有相同的可见性和访问级别。从C# 2.0开始,在属性实现中允许为get 或set 部分指定访问修饰符,从而覆盖为属性指定的访问修饰符

        对属性 使用访问修饰符有以下限制:

  • 不能对接口或显式实现的接口成员使用访问修饰符。
  • 仅当属性同时包含 set 和 get 访问器时,才能使用访问器修饰符。 这种情况下,只允许对其中之一使用修饰符。
  • 如果属性或索引器具有 override 修饰符,则访问器修饰符必须与重载的访问器的访问修饰符(如有)匹配。
  • 访问器的可访问性级别必须比属性本身的可访问性级别具有更严格的限制。
class Employee
{public void Initialize(int id) => Id = id.ToString();public string Id{get { return _Id;}private set { // Providing an access modifier is possible in C# 2.0 and higher only_Id = value;}}private string _Id;
}

二、构造器

1、构造器

1.1 构造器是与类名相同,没有返回值的方法, 例如:

class Employee
{public Employee(string firstName, string lastName) // constructor{FirstName = firstName;LastName = lastName;}public string FirstName { get; set; }public string LastName { get; set; }public string  Title {get; set}public string Salary { get; set; } = "Not Enough";public string Name{get{return FirstName + " " + LastName;}set{string[] names;names = value.Split(new char[] { ' ' });if (names.Length == 2){FirstName = names[0];LastName = names[1];}else{throw new System.ArgumentException(string.Format($"Assigned value '{ value }' is invalid", nameof(value)));}}}
}

1.2 调用构造器

public static void Main()
{Employee employee;employee = new Employee("Inigo", "Montoya");employee.Salary = "Too Little";Console.WriteLine(  "{0} {1}: {2}", employee.FirstName, employee.LastName,employee.Salary);
}

1.3 默认构造器

        如果类没有显式定义构造器,C# 编译器会在编译时自动添加一个不含任何参数的构造函数。一旦类显定义构造器,编译器就不会提供默认构造函数。

2、对象初始化器

        初始化器用于初始化对象中所有可以访问的字段和属性。在调用构造器时,可以在后面的大括号中添加成员初始化列表,例如:

public static void Main()
{Employee employee = new Employee("Inigo", "Montoya"){Title = "Computer Nerd",Salary = "Not enough"};Console.WriteLine("{0} {1} ({2}): {3}", employee.FirstName, employee.LastName, employee.Title, employee.Salary);
}

3、构造器链

        C# 中,允许从一个构造器中调用同一个类的另一个构造器, 方法是在一个冒号后添加this关键字,再添加被调用构造器的参数列表,例如:

class Employee
{public Employee(string firstName, string lastName){FirstName = firstName;LastName = lastName;}public Employee(int id, string firstName, string lastName): this(firstName, lastName){Id = id;}public Employee(int id){Id = id;// NOTE: Member constructors cannot be called explicitly inline// this(id, firstName, lastName);}public int Id { get; private set; }public string FirstName { get; set; }public string LastName { get; set; }public string Salary { get; set; } = "Not Enough";
}

4、匿名类型

        匿名类型是编译器动态生成的类型,编译器遇到匿名类型时,会自动生成一个CIL类。该类具有与匿名类型声明中已经命名的值和数据类型对应的属性。例如:

public static void Main()
{var patent1 =new{Title = "Bifocals",YearOfPublication = "1784"};      var patent2 =new{Title = "Phonograph",YearOfPublication = "1877"};  var patent3 =new{patent1.Title,Year = patent1.YearOfPublication};System.Console.WriteLine("{0} ({1})",patent1.Title, patent1.YearOfPublication);System.Console.WriteLine("{0} ({1})", patent2.Title, patent1.YearOfPublication);Console.WriteLine();Console.WriteLine(patent1);Console.WriteLine(patent2);Console.WriteLine();Console.WriteLine(patent3);
}

三、静态成员

1、静态字段

        在类的多个实例之间共享的字段,用static 关键字标识。和实例字段一样,静态字段也可以在声明时初始化。例如:

class Employee
{// ...public static int  Id;   // default(int): 0 public static int NextId = 42;// ...
}

        和实例字段不一样,未初始化的静态字段将获得默认值,即 default(T)的结果

2、静态方法

        和静态字段类似,静态方法也用static关键字标识。静态方法可以通过类名直接访问。例如:

public static void Main()
{DirectoryInfo directory = new DirectoryInfo(".\\Source");directory.MoveTo(".\\Root");DirectoryInfoExtension.CopyTo(directory, ".\\Target", SearchOption.AllDirectories, "*");
}
public static class DirectoryInfoExtension
{public static void CopyTo(  DirectoryInfo sourceDirectory, string target, SearchOption option, string searchPattern) {if (target[target.Length - 1] !=  Path.DirectorySeparatorChar)target += Path.DirectorySeparatorChar;if (!Directory.Exists(target))Directory.CreateDirectory(target);for (int i = 0; i < searchPattern.Length; i++){foreach (string file in  Directory.GetFiles(sourceDirectory.FullName, searchPattern))  {File.Copy(file, target + Path.GetFileName(file), true);}}if (option == SearchOption.AllDirectories) //Copy subdirectories (recursively){foreach (string element in Directory.GetDirectories(sourceDirectory.FullName))Copy(element,  target + Path.GetFileName(element),searchPattern);}}private static void Copy(string element, string fileName, string searchPattern){Console.WriteLine("Copying " + fileName);}
}

3、静态构造器

        静态构造器不显式调用,而是在运行时在首次访问类时自动调用。首次访问类发生在条用普通构造器时,也可能发生在访问类的静态方法或字段。静态构造器不允许带任何参数

class Employee
{static Employee(){Random randomGenerator = new Random();NextId = randomGenerator.Next(101, 999);}// ...public static int NextId = 42;// ...
}

4、静态属性

        属性也能static。例如:

class Employee
{// ...public static int NextId{get{return _NextId;}private set{_NextId = value;}}public static int _NextId = 42;// ...
}

5、静态类

        C#中也能定义静态类。静态类不含任何实例字段或方法。因此静态类不能实例化。编译器自动在CIL 代码中将静态类标记为abstract 和sealed。即将类指定为不可扩展

public static class SimpleMath
{public static int Max(params int[] numbers){if (numbers.Length == 0)  // Check that there is at least one item in numbers.throw new ArgumentException( "numbers cannot be empty", nameof(numbers));int result = numbers[0]; foreach (int number in numbers){if (number > result)result = number;}return result;}
}
public class Program
{public static void Main(string[] args){int[] numbers = new int[args.Length];for (int count = 0; count < args.Length; count++)numbers[count] = args[count].Length;Console.WriteLine( $@"Longest argument length = { SimpleMath.Max(numbers) }");}
}

6、封装数据

6.1 const 字段

  • const 字段是在编译时确定的值, 在运行时不会被改变。常量字段自动成为静态字段  
  • 如果一个程序集引用了另一个程序集中的常量,常量值将直接编译进引用的程序集中
class ConvertUnits
{public const float CentimersPerInch = 2.54F; public  const int  CupsPerGallon = 16;                                                           
}

6.2 readonly

        readonly 修饰符只能用于字段(不能用于局部变量)。它指出字段值只能从构造器中更改或声明时通过初始化器更改。

class Employee
{public Employee(int id){_Id = id;}private readonly int _Id;public int Id{get { return _Id; }}// Error: A readonly field cannot be assigned to (excep in a constructor or a variable initializer)// public void SetId(int id) =>_Id = id;
}

7、分部类

        分部类是一个类的多个部分, 这些部分可以合并成一个完整的类。分部类主要用于将一个类的定义划分到多个文件中。 C# 使用关键字partial来声明分部类

// File: Program1.cs
partial class Program
{
}
// File: Program2.cs
partial class Program
{
}

8、分部方法

        分部方法存在于分部类中,它允许在一个文件中声明方法,而在另一文件中实现该方法。例如:

// File: Person.Designer.cs
public partial class Person
{#region Extensibility Method Definitionspartial void OnLastNameChanging(string value);partial void OnFirstNameChanging(string value);#endregion// ...
}
// File: Person.cs
partial class Person
{partial void OnLastNameChanging(string value){//...}partial void OnFirstNameChanging(string value){//...}
}

相关文章:

【C# Programming】类、构造器、静态成员

一、类 1、类的概念 类是现实世界概念的抽象&#xff1a;封装、继承、多态数据成员&#xff1a; 类中存储数据的变量成员方法&#xff1a; 类中操纵数据成员的函数称为成员方法对象&#xff1a;类的实例类定义 class X {…} var instance new X(…); 2、实例字段 C#中…...

软件层面缓存基本概念与分类

缓存 缓存基本概念&#xff08;百度百科&#xff09; 缓存&#xff08;cache&#xff09;&#xff0c;原始意义是指访问速度比一般随机存取存储器&#xff08;RAM&#xff09;快的一种高速存储器&#xff0c;通常它不像系统主存那样使用DRAM技术&#xff0c;而使用昂贵但较快…...

单片机有哪些分类?

单片机有哪些分类? 1.AVR单片机-----速度快&#xff0c;一个时钟周期执行一条指令&#xff0c;而普通的51单片机需要12个时钟周期执行一条指令。当然&#xff0c;Atmel公司出品的AT89LP系列单片机也是一个时钟执行一条指令&#xff0c;但目前还未普及。AVR单片机比51单片机多…...

高阶数据结构-----三种平衡树的实现以及原理(未完成)

TreeMap和TreeSet的底层实现原理就是红黑树 一)AVL树: 1)必须是一棵搜索树:前提是二叉树&#xff0c;任取一个节点&#xff0c;它的左孩子的Key小于父亲节点的Key小于右孩子节点的Key&#xff0c;中序遍历是有序的&#xff0c;按照Key的大小进行排列&#xff0c;高度平衡的二叉…...

北斗高精度组合导航终端

UWB&#xff08;Ultra-Wideband&#xff09;、卫星定位&#xff08;GNSS&#xff09;&#xff0c;以及IMU&#xff08;Inertial Measurement Unit&#xff09;的组合定位系统结合了多种传感器和定位技术&#xff0c;以提供高精度、高可靠性的位置估计。这种组合定位系统在各种应…...

低代码平台是否能替代电子表格?

在计算机技术普及之前&#xff0c;会计、助理或者是销售人员&#xff0c;都需要用纸和笔来记录和维护每一笔交易。计算机技术兴起之后&#xff0c;一项技术发明——电子表格的出现改变了低效的状况。电子表格的第一个版本出现在1977年&#xff0c;一个名为“VisiCalc”的程序。…...

qt多个信号如何关联一并处理

主要方法&#xff1a; 首先&#xff0c;需要创建一个包含自定义信号和槽的Qt类。假设要创建一个名为MyObject的类&#xff0c;并在其中定义一个自定义信号和一个槽。这个类的头文件可能如下所示&#xff1a; #ifndef MYOBJECT_H #define MYOBJECT_H#include <QObject>c…...

【python爬虫】12.建立你的爬虫大军

文章目录 前言协程是什么多协程的用法gevent库queue模块 拓展复习复习 前言 照旧来回顾上一关的知识点&#xff01;上一关我们学习如何将爬虫的结果发送邮件&#xff0c;和定时执行爬虫。 关于邮件&#xff0c;它是这样一种流程&#xff1a; 我们要用到的模块是smtplib和emai…...

2023数学建模国赛C题思路--蔬菜类商品的自动定价与补货决策

C 题 蔬菜类商品的自动定价与补货决策 在生鲜商超中&#xff0c;一般蔬菜类商品的保鲜期都比较短&#xff0c;且品相随销售时间的增加而变差&#xff0c; 大部分品种如当日未售出&#xff0c;隔日就无法再售。因此&#xff0c;商超通常会根据各商品的历史销售和需 求情况每天进…...

vue2与vue3的使用区别

1. 脚手架创建项目的区别&#xff1a; vue2: vue init webpack “项目名称”vue3: vue create “项目名称” 或者vue3一般与vite结合使用: npm create vitelatest yarn create vite2. template中结构 vue2: template下只有一个元素节点 <template><div><div…...

Apache httpd漏洞复现

文章目录 未知后缀名解析漏洞多后缀名解析漏洞启动环境漏洞复现 换行解析漏洞启动环境漏洞复现 未知后缀名解析漏洞 该漏洞与Apache、php版本无关&#xff0c;属于用户配置不当造成的解析漏洞。在有多个后缀的情况下&#xff0c;只要一个文件含有.php后缀的文件即将被识别成PHP…...

【漏洞复现】时空智友企业流程化管控系统文件上传

漏洞描述 通过时空智友该系统,可让企业实现流程的自动化、协同上提升、数据得洞察及决策得优化,来提高工作效率、管理水平及企业的竞争力。时空智友企业流程化 formservice接口处存有任意文件上传漏洞,未经认证得攻击者可利用此接口上传后门程序,可导致服务器失陷。 免责…...

elasticsearch的DSL查询文档

DSL查询分类 查询所有&#xff1a;查询出所有数据&#xff0c;一般测试用。例如&#xff1a;match_all 全文检索&#xff08;full text&#xff09;查询&#xff1a;利用分词器对用户输入内容分词&#xff0c;然后去倒排索引库中匹配。例如&#xff1a; match_query multi_ma…...

IP地址、子网掩码、网络地址、广播地址、IP网段

文章目录 IP地址IP地址分类子网掩码网络地址广播地址IP网段 本文主要讨论iPv4地址。 IP地址 实际的 IP 地址是一串32 比特的数字&#xff0c;按照 8 比特&#xff08;1 字节&#xff09;为一组分成 4 组&#xff0c;分别用十进制表示然后再用圆点隔开&#xff0c;这就是我们平…...

ffmpeg-android studio创建jni项目

一、创建native项目 1.1、选择Native C 1.2、命名项目名称 1.3、选择C标准 1.4、项目结构 1.5、app的build.gradle plugins {id com.android.application }android {compileSdk 32defaultConfig {applicationId "com.anniljing.ffmpegnative"minSdk 25targetSdk 32…...

智慧公厕是将数据、技术、业务深度融合的公共厕所敏捷化“操作系统”

文明社会的进步离不开公共设施的不断创新和提升。而在这些公共设施中&#xff0c;公共厕所一直是一个备受关注和改善的领域。近年来&#xff0c;随着智慧城市建设的推进&#xff0c;智慧公厕成为了城市管理的重要一环。智慧公厕不仅仅是为公众提供方便和舒适的便利设施&#xf…...

JVM中JAVA对象和数组内存布局

对象 数组 在Java中&#xff0c;所有的对象都是一种特殊的数组&#xff0c;它们的元素可以是基本数据类型、其他对象引用或者其他任何类型。Java对象和数组的内存布局包含以下部分&#xff1a; 1.对象头&#xff08;Object Header&#xff09; 每个Java对象都有一个对象头&am…...

【2023年数学建模国赛】赛题发布

2023数学建模国赛赛题已经发布啦&#xff0c;距离赛题发布已经过去三个小时了&#xff0c;大家是否已经确定题目呢&#xff1f;学姐后续会持续更新赛题思路与代码~...

Java HashMap源码学习

Java HashMap源码学习 基本使用 包含创建&#xff0c;添加&#xff0c;删除&#xff0c;迭代&#xff0c;打印 val map java.util.HashMap<Int, Int>() map.put(1, 2) map.put(2, 2) map.put(3, 2) map.remove(1) map.forEach {println("it.key${it.key}, it.va…...

Gin中用于追踪用户的状态的方法?!!!

Gin中的Cookie和Session的用法 文章目录 Gin中的Cookie和Session的用法介绍Cookie代码演示 Session代码展示 介绍 cookie 和 session 是 Web 开发中常用的两种技术&#xff0c;主要用于跟踪用户的状态信息。 Cookie func (c *Context) Cookie(name string, value string, max…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

SQL注入篇-sqlmap的配置和使用

在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap&#xff0c;但是由于很多朋友看不了解命令行格式&#xff0c;所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习&#xff0c;链接&#xff1a;https://wwhc.lanzoue.com/ifJY32ybh6vc…...