C# 面向对象编程进阶:构造函数详解与访问修饰符应用
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"
请注意,构造函数的名称必须与类名匹配,并且不能有返回类型(如 void
或 int
)。
还请注意,构造函数在创建对象时调用。
所有类默认都有构造函数:如果您自己不创建类构造函数,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 internal
和 private protected
。
现在,让我们重点关注 public
和 private
修饰符。
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
get
和set
方法来访问和更新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# 面向对象编程进阶:构造函数详解与访问修饰符应用的更多相关文章
- 详解java访问修饰符
详解java访问修饰符 为了防止初学者看到因为专业的术语而感觉晦涩难懂,我接下来尽量用生动比喻的说法来解释!首先第一点,我们来讲讲什么叫修饰符!看看这个名称,想想他的意思.修饰符!修饰符!,就是用来修 ...
- [.net 面向对象编程基础] (8) 基础中的基础——修饰符
[.net 面向对象编程基础] (8) 基础中的基础——修饰符 在进入C#面向对象核心之前,我们需要先对修饰符有所了解,其实我们在前面说到变量和常量的时候,已经使用了修饰符,并且说明了变量和常量的修改 ...
- @property详解,@property修饰符以及各个修饰符区别(上)
相信很多参加过面试的人员很多都会被问到:weak与assign的区别,copy与strong的区别.如果你仅仅说一点点copy一般对NSString,weak对于控件的修饰,assign对于基本类型, ...
- Day7 - Python基础7 面向对象编程进阶
Python之路,Day7 - 面向对象编程进阶 本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个 ...
- [转]c++类的构造函数详解
c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初 ...
- c++构造函数详解
c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初 ...
- 【python进阶】详解元类及其应用2
前言 在上一篇文章[python进阶]详解元类及其应用1中,我们提到了关于元类的一些前置知识,介绍了类对象,动态创建类,使用type创建类,这一节我们将继续接着上文来讲~~~ 5.使⽤type创建带有 ...
- python面向对象编程进阶
python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...
- Java网络编程和NIO详解开篇:Java网络编程基础
Java网络编程和NIO详解开篇:Java网络编程基础 计算机网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为 ...
- Java网络编程和NIO详解9:基于NIO的网络编程框架Netty
Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introd ...
随机推荐
- Flex 弹性盒子布局
可以少去理解一些不必要的概念,而多去思考为什么会有这样的东西,它解决了什么问题,或者它的运行机制是什么? 1. 弹性盒子布局概念 Flex 是 Flexible Box 的缩写,意为"弹性布 ...
- 云原生基础设施实践:NebulaGraph 的 KubeBlocks 集成故事
像是 NebulaGraph 这类基础设施上云,通用的方法一般是将线下物理机替换成云端的虚拟资源,依托各大云服务厂商实现"服务上云".但还有一种选择,就是依托云数据基础设施,将数据 ...
- [Rocky Linux] 使用btrfs
使用btrfs rocky本身并没有btrfs的相关管理工具,所以需要自己安装,但是遗憾的发现它的源中啥也没有.只能考虑自己安装. 相关说明 btrfs Wiki (kernel.org) 可以从中得 ...
- adb monkey 有哪些参数?
adb monkey 是 Android Debug Bridge (ADB) 工具中的一个命令,用于执行随机事件来对 Android 应用进行压力测试.以下是 adb monkey 命令的一些常用参 ...
- Codeforces Round 916 (Div. 3)(A~E2)
A 统计一下每个字母的出现次数然后输出即可 #include <bits/stdc++.h> #define rep(i,a,b) for(register int i = (a); i ...
- Python面向对象之多态和鸭子类型
[一]多态 [1]什么是多态 多态指的是一类事物有多种形态 [2]示例 比如动物有多种形态:猫.狗.猪 import abc class Animal(metaclass=abc.ABCMeta): ...
- day01-1-需求分析和项目设计
满汉楼01 1.需求分析 满汉楼项目说明 因为javaGUI不是学习的重点,这里将继续使用控制台界面来代替界面和事件处理 完成的功能: 登录 订座 点餐 结账 查看账单等功能 在实际项目中,独立完成项 ...
- jenkins安装和基本使用
参考:https://zhuanlan.zhihu.com/p/56037782(安装) https://gitee.com/oschina/Gitee-Jenkins-Plugin/(使用) htt ...
- [置顶]
java动态控制线程的启动和停止
最近项目有这样的需求:原来系统有个计算的功能,但该功能执行时间会很长(大概需要几个小时才能完成),如果执行过程中出现了错误的话,也只能默默的等待错误执行完成才行,无法做到动态的对该功能进行停止. 我了 ...
- 自己想到的几道Java面试题
1.在抽象类中能否写main方法,为什么? 2.在接口中能否写main方法,为什么? 3.Java能否使用静态局部变量,为什么? 4.Java类变量,实例变量,局部变量在多线程环境下是否线程安全,为什 ...