1.类外部调用类内的静态变量和静态成员
C#中类内定义的静态变量和静态方法,在类外访问是用类名.变量 或者 类名.方法
public class MyClass
{
public static int MyStaticVariable = 10;
public static void MyStaticMethod()
{
Console.WriteLine("This is a static method.");
}
}
int value = MyClass.MyStaticVariable;
Console.WriteLine(value); // 输出:10
MyClass.MyStaticMethod(); // 输出:This is a static method.
不需要实例化调用,也不能实例化调用。
2.类中get和set
cpp中似乎没有这种操作,更多的是用构造函数。
public class MyClass
{
private int myField;
public int MyProperty
{
get
{
return myField; // 返回字段的值
}
set
{
myField = value; // 设置字段的值
}
}
}
MyClass obj = new MyClass();
obj.MyProperty = 10; // 设置属性的值
int value = obj.MyProperty; // 获取属性的值
Console.WriteLine(value); // 输出:10
3.C#中类和结构体(后面再想想!有点意思)
结构体是值类型,类是引用类型。所以,结构体是针对栈区内存分配,类是针对堆区内存分配。
栈区内存,在函数结束时进行回收;堆区内存,在整个C#程序结束时进行回收。
class类实例化对象,在堆区开辟存放数据,在栈区保存的是地址。
4.在C#中abstract和partial
两个用于修饰类的关键字
abstract表明该类是抽象类,不能被实例化,主要作用是被子类继承,其中包含虚函数(纯虚函数),子类函数必须重写实现具体功能。
partial用于指定一个类、结构体、接口或方法可以分部定义在多个文件中。这对于大型代码文件或多人协作开发非常有用,可以将类或方法的不同部分分割到不同的文件中进行编辑。
5.C#中字符串格式化
类似Python。
方法一:$字符和插值
string name = "Alice";
int age = 25;
string message = $"My name is {name} and I'm {age} years old.";
方法二:占位符
string name = "Bob";
int score = 85;
string message = string.Format("Player: {0}, Score: {1}", name, score);
6.C#中捕获异常
static void Main(string[] args)
{
Console.WriteLine("请输入你的年龄:");
string age = Console.ReadLine();
int Myage = 0;
try
{
Myage = int.Parse(age) + 10;
}
catch
{
Console.WriteLine("请输入正确的数字");
return;
}
Console.WriteLine(Myage);
Console.ReadKey();
}
防止用户输入的是字符。如果输入非int类型无法被转换,那么catch将捕获异常进行处理,打印出一句话并且return提前返回。
只有一个return是因为void类型的main函数。
try中如果没有问题,将执行try中的知道完成。try可以理解为一个检测机制,有错误直接进入catch。
7.C#代码抽离
分文件编写,使用时调用:using Class…
但是外部调用最好采用封装方式,类似dll分享。
在同一解决方案中,新建类库。
在类库中编写cs放类文件,然后生成会编译出一个dll文件,将main.cs中的引用加入需要引用的dll,然后在代码中using即可。
这样重新生成main.cs的方案,就会在bin文件中找到exe和dll,双击运行
8.C#语法糖(Syntactic sugar)
语法糖相当于什么?–什么是语法糖? - riophae的回答 - 知乎
https://www.zhihu.com/question/20651624/answer/158453242
语法糖场景1:自动属性
私有属性+公共访问属性
public class Person
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
value关键字是在 C# 属性的 set 访问器中使用的, 它表示正在被设置的新值,是一个临时变量。
Person person = new Person();
person.Name = "Tom";
Console.WriteLine(person.Name);
Console.ReadKey();
9.winForm界面:sender
private void button1_Click(object sender, EventArgs e)
{
Button btn = (Button)sender;
// Button btn = sender as Button;
btn.Text = "ahhh";
}
sender用来表示触发事件的对象。通过点击按钮button1,来触发。
英文单词sender:发送者,发送点击button1的动作。
10.C#单例模式(内部静态类)
官方定义:确保一个类只有一个实例(通常为静态属性), 并提供一个全局访问点(使全局都可以访问到这个实例)
补充一点:私有构造函数,可以限制类外实例化,即C#中无法在类外用new来正常实例化。也就意味着该类要想被实例化只能在类内。通常搭配单例模式和工厂模式等。
特点:
1.单例类只有一个实例对象;
2.单例对象必须由单例类自行创建;
3.单例类对外提供一个访问该单例的全局访问点。
优点:
1.以保证内存里只有一个实例,减少了内存的开销;
2.避免对资源的多重占用;
3.设置全局访问点,可以优化和共享资源的访问。
基本举例:
public sealed class Singleton
{
// 用于保存唯一实例的私有静态字段
private static Singleton instance = null;
// 用于线程安全的锁对象
private static readonly object lockObj = new object();
// 私有构造函数,防止外部创建实例
private Singleton() {}
// 公共静态方法,提供全局访问点
public static Singleton Instance
{
get
{
// 双重检查锁定机制,确保线程安全
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
public Form1 formLogin = null;
}
// 示例方法
public void DoSomething()
{
Console.WriteLine("Singleton instance doing something.");
}
}
首先创建内部静态类和私有构造函数。(c#静态类不能被new实例化)
然后在内部静态类中创建唯一实例。
最后创建公有方法来获得这个实例。
有一点比较绕的地方:
public class GlobalFunc
{
public string Name = "";
// 唯一公共静态实例
public static GlobalFunc _Instance = null;
// 单例模式标志:静态类+私有化构造函数,使得类外无法用new实现
private GlobalFunc() { }
// 类内声明
public static GlobalFunc Instance
{
get
{
if (_Instance == null)
_Instance = new GlobalFunc();
return _Instance;
}
}
public Form1 formLogin = null;
}
在main中我可以:
Form1 form1 = new Form1();
GlobalFunc.Instance.formLogin = form1;
第一眼看起来似乎有一点怪,因为GlobalFunc.Instance.formLogin总感觉是GlobalFunc类型的,而form1是Form1类型的。
但实际上根据public static GlobalFunc Instance的返回值可以看出,GlobalFunc.Instance实际上已经创建好了一个GlobalFunc类型的对象,是该实例化对象调用了formLogin,类型变为了Form1。
11.C#中static关键字
1.静态类
类名前加上static:public static class MyClass,类外无法被实例化,也无法被继承
静态类只能包含静态成员,并且具有共享性
静态类类外调用内部属性通过【类.属性】的方式
静态类内部通常包括各种方法
注意:私有构造函数也可以实现类外无法实例化这一效果,但是静态类全局不可被实例化,私有构造函数在类内可以被实例化。
2.静态属性:变量和方法
静态类的属性必须为静态属性,静态属性属于类本身,而不属于类的实例。所有实例共享这一个静态属性。
12.C# .NET/.NET Core/.NET Framework/.NET Standard
1…NET(5.0以后被整合)
.NET 提供多平台的框架( Linux、macOS、Windows、iOS、Android 等),.NET是一个平台总称,是一套软件开发框架,平台上可以编程很多语言(C#,F#,VB.Net),以及包含很多库以及库管理工具(NuGet 包管理器),和运行时(如CLR,Common Language Runtime)。
由.NET Framework(主要用于Windows平台的传统框架)和.NET Core(跨平台的轻量级版本)等组成。
visual studio和.NET的区别?
vs是集成开发环境(IDE),简单来说就是用来可视化地写代码(编写、调试、测试.NET 应用程序),.NET只是一个框架,提供运行时、库和开发工具。
总结:开发者使用Visual Studio编写代码,而这些代码通常是基于 .NET 框架的。
2…NET Framework(最早概念,局限于Windows)
2002年提出,NET Framework 是 .NET 的原始实现方式。它支持在 Windows 上运行网站、服务、桌面应用等。
3…NET Core(目的是跨平台)
.NET Core 于2016年首次发布,是对传统 .NET Framework 的一次现代化重构。自 .NET 5 起,.NET Core 和 .NET Framework 统一为一个单一的平台,称为 .NET。
4…NET Standard
.NET Standard 是一个正式化的API规范,定义了在所有 .NET 实现中应该提供的API集合。它的主要目标是确保不同 .NET 平台(如 .NET Framework、.NET Core、Mono、Xamarin 等)之间的库兼容性,从而简化跨平台开发。
官方兼容情况:.NET Standard
13.生成dll库并调用
CSharp知识点【C#】【功能例程】 - Github开源项目功能提取、自定义类库、演示dll文件包的调用
过程:抽离出别人开源项目中的功能性代码,将属性和方法都拷贝到类中,生成一个专属的dll。然后在sln中新建一个.netFramework的项目,调用这个dll库。
在引用中可以找到链接上
将控制台项目设置为启动项目,运行!