C# 构造函数

构造函数是一种特殊的方法,用于初始化对象。构造函数的优势在于,在创建类的对象时调用它。它可以用于为字段设置初始值:

示例 获取您自己的 C# 服务器

创建一个构造函数:

// 创建一个 Car 类
class Car
{
public string model; // 创建一个字段 // 为 Car 类创建一个类构造函数
public Car()
{
model = "Mustang"; // 为 model 设置初始值
} static void Main(string[] args)
{
Car Ford = new Car(); // 创建一个 Car 类的对象(这将调用构造函数)
Console.WriteLine(Ford.model); // 打印 model 的值
}
}

输出 "Mustang"

请注意,构造函数的名称必须与类名匹配,并且不能有返回类型(如 voidint)。

还请注意,构造函数在创建对象时调用。

所有类默认都有构造函数:如果您自己不创建类构造函数,C# 会为您创建一个。然而,这样您就无法为字段设置初始值。

构造函数参数

构造函数还可以接受参数,用于初始化字段。

下面的示例在构造函数中添加了一个字符串 modelName 参数。在构造函数内部,我们将 model 设置为 modelName(model=modelName)。当我们调用构造函数时,将参数传递给构造函数("Mustang"),这将将 model 的值设置为 "Mustang":

示例

class Car
{
public string model; // 创建带有参数的类构造函数
public Car(string modelName)
{
model = modelName;
} static void Main(string[] args)
{
Car Ford = new Car("Mustang");
Console.WriteLine(Ford.model);
}
}

输出 "Mustang"

您可以拥有任意数量的参数:

示例

class Car
{
public string model;
public string color;
public int year; // 创建带有多个参数的类构造函数
public Car(string modelName, string modelColor, int modelYear)
{
model = modelName;
color = modelColor;
year = modelYear;
} static void Main(string[] args)
{
Car Ford = new Car("Mustang", "Red", 1969);
Console.WriteLine(Ford.color + " " + Ford.year + " " + Ford.model);
}
}

输出 Red 1969 Mustang

提示:与其他方法一样,构造函数可以通过使用不同数量的参数进行重载。

构造函数节省时间

没有构造函数:

class Program
{
static void Main(string[] args)
{
Car Ford = new Car();
Ford.model = "Mustang";
Ford.color = "red";
Ford.year = 1969; Car Opel = new Car();
Opel.model = "Astra";
Opel.color = "white";
Opel.year = 2005; Console.WriteLine(Ford.model);
Console.WriteLine(Opel.model);
}
}

有构造函数:

class Program
{
static void Main(string[] args)
{
Car Ford = new Car("Mustang", "Red", 1969);
Car Opel = new Car("Astra", "White", 2005); Console.WriteLine(Ford.model);
Console.WriteLine(Opel.model);
}
}

C# 访问修饰符

到目前为止,您已经很熟悉我们许多示例中出现的 public 关键字:

public string color;

public 关键字是一个访问修饰符,用于设置类、字段、方法和属性的访问级别/可见性。

C# 具有以下访问修饰符:

修饰符 描述
public 代码可供所有类访问
private 代码只能在同一类中访问
protected 代码可以在同一类中访问,或在从该类继承的类中访问
internal 代码只能在其自己的程序集中访问,但不能从另一个程序集中访问

还有两种组合:protected internalprivate protected

现在,让我们重点关注 publicprivate 修饰符。

private 修饰符

如果您使用 private 访问修饰符声明一个字段,则它只能在同一类中访问:

示例

class Car
{
private string model = "Mustang"; static void Main(string[] args)
{
Car myObj = new Car();
Console.WriteLine(myObj.model);
}
}

输出将是:

Mustang

如果您尝试在类外部访问它,将会发生错误:

示例

class Car
{
private string model = "Mustang";
} class Program
{
static void Main(string[] args)
{
Car myObj = new Car();
Console.WriteLine(myObj.model);
}
}

输出将是:

'Car.model' 由于其保护级别而无法访问
字段“Car.model”已分配,但其值从未使用过

public 修饰符

如果您使用 public 访问修饰符声明一个字段,则它对所有类都可访问:

示例

class Car
{
public string model = "Mustang";
} class Program
{
static void Main(string[] args)
{
Car myObj = new Car();
Console.WriteLine(myObj.model);
}
}

输出将是:

Mustang

为什么要使用访问修饰符?

  • 控制类成员的可见性(每个单独的类和类成员的安全级别)。
  • 实现“封装”——这是一个确保对用户隐藏“敏感”数据的过程。这是通过将字段声明为 private 来完成的

如果您不指定访问修饰符,默认情况下,类的所有成员都是 private

示例

class Car
{
string model; // private
string year; // private
}

C# 属性(Get 和 Set)

在开始解释属性之前,您应该对“封装”有一个基本的了解。

封装的含义是确保对用户隐藏“敏感”数据。要实现这一点,您必须:

  • 将字段/变量声明为 private
  • 通过属性提供 public getset 方法来访问和更新 private 字段的值

属性

private 变量只能在同一类中访问(外部类无法访问它)。但是,有时我们需要访问它们 - 这可以通过属性来完成。

属性就像是变量和方法的结合,它有两个方法:get 方法和 set 方法:

示例

class Person
{
private string name; // 字段 public string Name // 属性
{
get { return name; } // get 方法
set { name = value; } // set 方法
}
}

示例解释

  • Name 属性与 name 字段相关联。通常的做法是属性和 private 字段使用相同的名称,但首字母大写。
  • get 方法返回 name 变量的值。
  • set 方法将一个值赋给 name 变量。value 关键字表示我们赋给属性的值。

使用属性

现在我们可以使用 Name 属性来访问和更新 Person 类的 private 字段:

示例

class Person
{
private string name; // 字段
public string Name // 属性
{
get { return name; }
set { name = value; }
}
} class Program
{
static void Main(string[] args)
{
Person myObj = new Person();
myObj.Name = "Liam";
Console.WriteLine(myObj.Name);
}
}

输出

Liam

自动属性(简写)

C# 还提供了一种使用简写/自动属性的方法,您无需为属性定义字段,只需在属性中编写 get;set;

以下示例将产生与上述示例相同的结果。唯一的区别是代码更少:

示例

class Person
{
public string Name // 属性
{ get; set; }
}

为什么要封装?

  • 更好地控制类成员(减少自己或他人搞乱代码的可能性)
  • 字段可以设为只读(如果只使用 get 方法),或只写(如果只使用 set 方法)
  • 灵活:程序员可以更改代码的一部分而不影响其他部分
  • 提高数据安全性

最后

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:Let us Coding,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎 点赞、收藏、关注

C# 面向对象编程进阶:构造函数详解与访问修饰符应用的更多相关文章

  1. 详解java访问修饰符

    详解java访问修饰符 为了防止初学者看到因为专业的术语而感觉晦涩难懂,我接下来尽量用生动比喻的说法来解释!首先第一点,我们来讲讲什么叫修饰符!看看这个名称,想想他的意思.修饰符!修饰符!,就是用来修 ...

  2. [.net 面向对象编程基础] (8) 基础中的基础——修饰符

    [.net 面向对象编程基础] (8) 基础中的基础——修饰符 在进入C#面向对象核心之前,我们需要先对修饰符有所了解,其实我们在前面说到变量和常量的时候,已经使用了修饰符,并且说明了变量和常量的修改 ...

  3. @property详解,@property修饰符以及各个修饰符区别(上)

    相信很多参加过面试的人员很多都会被问到:weak与assign的区别,copy与strong的区别.如果你仅仅说一点点copy一般对NSString,weak对于控件的修饰,assign对于基本类型, ...

  4. Day7 - Python基础7 面向对象编程进阶

    Python之路,Day7 - 面向对象编程进阶   本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个 ...

  5. [转]c++类的构造函数详解

    c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初 ...

  6. c++构造函数详解

    c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初 ...

  7. 【python进阶】详解元类及其应用2

    前言 在上一篇文章[python进阶]详解元类及其应用1中,我们提到了关于元类的一些前置知识,介绍了类对象,动态创建类,使用type创建类,这一节我们将继续接着上文来讲~~~ 5.使⽤type创建带有 ...

  8. python面向对象编程进阶

    python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...

  9. Java网络编程和NIO详解开篇:Java网络编程基础

    Java网络编程和NIO详解开篇:Java网络编程基础 计算机网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为 ...

  10. Java网络编程和NIO详解9:基于NIO的网络编程框架Netty

    Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introd ...

随机推荐

  1. djang中文件上传MEDIA路径配置

    1.settings.py文件中配置 # 项目中存储上传文件的根目录[暂时配置],注意,uploads目录需要手动创建否则上传文件时报错 MEDIA_ROOT = os.path.join(BASE_ ...

  2. gin中间件&控制器

    中间件 Gin 框架允许开发者在处理请求的过程中,加入用户自己的钩子(Hook)函数.这个钩子函数就叫中间件,中间件适合处理一些公共的业务逻辑,比如登录认证.权限校验.数据分页.记录日志.耗时统计等. ...

  3. JVM类的加载和加载器

    JVM类的加载和类的加载器 一.类的加载过程 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来 ...

  4. 【LeetCode剑指offer 02】矩阵中的路径(老鼠走迷宫plus,应用深度优先搜索与回溯机制)

    矩阵中的路径 https://leetcode.cn/problems/ju-zhen-zhong-de-lu-jing-lcof/ 给定一个 m x n 二维字符网格 board 和一个字符串单词 ...

  5. 云原生:使用HPA和VPA实现集群扩缩容

    1 背景 我们之前介绍过,随着业务流量上涨之后,我们的系统需要适时的进行扩容. 数据存储层我们也介绍过MySQL的扩容 Scale UP(纵向扩展) 和 Scale Out(横向扩展) 垂直拆分(Sc ...

  6. C++ STL 容器-array类型

    C++ STL 容器-array类型 array是C++11STL封装的数组,内存分配在栈中stack,绝对不会重新分配,随机访问 创建和初始化 // 下面的等同于int a[10]; std::ar ...

  7. docker 安装 es-head 以及Content-Type header请求头错误解决

    拉取es-head镜像,启动 docker pull mobz/elasticsearch-head:5 docker run -itd --name es-head -p 9100:9100 mob ...

  8. SQLServer 导入 Excel 表数据报错“文本被截断。。。”

    报错详情(关键信息就是:文本被截断) 错误 0xc020901c: 数据流任务 1: 输出"Excel 源输出"(9) 上的 输出列"xxxxx"(78) 出错 ...

  9. 从零开始写 Docker(六)---实现 mydocker run -v 支持数据卷挂载

    本文为从零开始写 Docker 系列第六篇,实现类似 docker -v 的功能,通过挂载数据卷将容器中部分数据持久化到宿主机. 完整代码见:https://github.com/lixd/mydoc ...

  10. electron实现静默下载(各种踩坑解决)

    前车之鉴 也是阅读了很多资料和前人踩的坑,直接使用webContent.print方法进行打印.其他方式要不就是Bug多,官方修复也有问题:要不就是官方升级版本后不再支持等 不赘述 需求思路 在mai ...