C# 2中的一些小特性

一、局部类型

在C#当中有这样一个关键字partial 用来声明类,结构,接口分为多个部分来声明。使用场景可以一部分类中写实例方法,一部分写属性,我在实际工作测试中就是将属性与实际方法是分开的。相互之间的成员互相通用。

举个例子:

cs 复制代码
public partial class S
{
    public int MyProperty { get; set; }
}
public partial class S
{
    public void Console()
    {

    }
}

示例解释:

定义了一个局部类型(这里是定义的部分类)其中当前的S这个类中具有一个属性一个方法

局部方法

和上述定义的局部类一样,可以定义局部方法,局部方法可以分多个部分一部分只具有方法名称不建议实际方法体,另一部分可以选择是否实现,如果没有实现如果有调用当前没有方法体的局部方法,那么编译器会自动删除当前所有调用的引用不影响程序性能。

举个例子:

cs 复制代码
public partial class S
{
    public partial void O( );

}
public partial class S
{
    public partial void O( )
    {
    }
}

示例解释:当前定义两个部分方法其中部分方法体在下面的这个部分类中。

二、静态类

静态类在我们开发实例当中我们经常把静态类用为一个工具类是最常见的一个用法。静态类中不能有实例成员如不能有非静态的属性非静态的方法也不能具有实例构造函数

举个例子:

cs 复制代码
public static class DBHelper
{
    public static DataTable Find(string sql)//查询
    {
       throw new NotImplementedException();
    }
}

示例解释: 定义了一个数据库帮助类(没有实现具体逻辑)

三、属性的访问分离

用途只想在当前类内部对属性进行访问get块以及set块不想外部访问get块或者set块,保护属性的可访问性权限

举个例子(只读外部无法访问私有的Set块):

cs 复制代码
public class DBHelper
{
    private int myVar;

    public int MyProperty
    {
         get { return myVar; }
        private set { myVar = value; }
    }
}

提示:可以将Set或Get设置为受保护的、内部的、受保护的内部的、私有的(protected 、internal、protected internal、private )

四、命名空间别名

见文章:高级C#技术(一)-CSDN博客

五、编译指令

我们在编译C#代码的时候我们通常会收到编译器的警告。通常这种警告提示是类似:声明了某个变量,但没有使用到当前变量会警告、没有给当前变量赋初始值也就是我们所说的未初始化,也会警告。等等。我们可以使用如下代码来进行屏蔽表示警告的代码

举个例子:

我们需要屏蔽如下警告代码(CS8618)

声明方式:

cs 复制代码
#pragma warning disable CS8618
    public S3()
    {
        Age = MyProperty;
    }
    public ICommand command { get; private set; }
    public ICommand command2 { get; private set; }
    public ICommand command22 { get; private set; }
#pragma warning restore CS8618

示例解释:

当前被包起来的区域将不会抛出警告代码为CS8618的警告内容,如果删除 #pragma warning restore CS8618则代表#pragma warning disable CS8618只下的代码全部取消CS8618的警告。

CS的含义: C# 的编译器修改了警告标识的规则,如C#的编译器的警告的标准的规则则是警告代码前缀是CS开头

六、固定大小缓存区

固定大小缓存区这项特性只能用于非安全的代码并且只能用于结构体内部。固定大小缓存区允许你直接访问托管堆栈上的内存,这对于性能敏感的代码特别有用。

非安全代码:指的是固定大小缓存区只能在不安全(unsafe)代码中使用。这是因为固定大小缓存区允许你直接操作内存 。

举个例子:

cs 复制代码
unsafe class Program  
{  
    static unsafe void Main(string[] args)  
    {  
        byte[] buffer = new byte[100];  
        fixed (byte* pBuffer = buffer)  
        {  
            // 在这里,pBuffer指向固定大小的缓冲区  
            // 你可以使用指针pBuffer进行直接内存操作  
        }  
    }  
}

示例解释:

为什么称呼它为非安全代码示例,因为当前 使用fixed关键字将其固定在内存中。通过指针pBuffer,我们可以直接访问和操作这个固定大小的缓冲区。 因为它直接操作内存。在编写这样的代码时,必须非常小心,以避免出现内存泄漏、悬挂指针等问题。


提示:如果无法编译则需要 在 '解决方案资源管理器' -> 右击 -> 选择 '属性' -> 选择'生成' -> 选择 '允许不安全代码' 后就可以通过编译了。

只能在结构体内部使用:固定大小缓存区只能定义在结构体(struct)内部。这是因为结构体在C#中是值类型,其生命周期与栈帧一致,因此能够确保在固定大小缓冲区被释放时,不会发生悬挂指针(dangling pointers)。与之相对,类(class)是引用类型,其生命周期由垃圾回收器管理,因此不能保证在释放内存后不会发生悬挂指针。

七、InternalsVisiblTo

此项技术我觉得(非本人):.NET 中的 InternalsVisibleTo - 知乎 (zhihu.com)

注意:这个博主可能比我理解更好,我这就不介绍了

相关推荐
I_Am_Me_15 分钟前
【JavaEE进阶】 JavaScript
开发语言·javascript·ecmascript
重生之我是数学王子25 分钟前
QT基础 编码问题 定时器 事件 绘图事件 keyPressEvent QT5.12.3环境 C++实现
开发语言·c++·qt
Ai 编码助手27 分钟前
使用php和Xunsearch提升音乐网站的歌曲搜索效果
开发语言·php
学习前端的小z31 分钟前
【前端】深入理解 JavaScript 逻辑运算符的优先级与短路求值机制
开发语言·前端·javascript
神仙别闹38 分钟前
基于C#和Sql Server 2008实现的(WinForm)订单生成系统
开发语言·c#
XINGTECODE40 分钟前
海盗王集成网关和商城服务端功能golang版
开发语言·后端·golang
zwjapple1 小时前
typescript里面正则的使用
开发语言·javascript·正则表达式
小五Five1 小时前
TypeScript项目中Axios的封装
开发语言·前端·javascript
前端每日三省1 小时前
面试题-TS(八):什么是装饰器(decorators)?如何在 TypeScript 中使用它们?
开发语言·前端·javascript
凡人的AI工具箱1 小时前
15分钟学 Go 第 60 天 :综合项目展示 - 构建微服务电商平台(完整示例25000字)
开发语言·后端·微服务·架构·golang