首页 > 编程语言 >C# 里面的小知识

C# 里面的小知识

时间:2023-01-10 17:01:40浏览次数:46  
标签:里面 C# 知识 IControl 接口 sample Paint Tom ISurface

最近在B站刷视频的时候刷到了一个C#冷知识系列的视频,恰好最近从头开始看官方文档,就想着把他整理成文档当作自己的随笔。

视频链接:C# 的一些冷知识

这边不考虑性能什么方面的问题,只是分享,可能用不到到但是不能不知道。

函数的传参

先来一个一般正常函数的示例:

// 正常传参调用函数 (位置传参,参数和函数声明的参数要一一对应)
Foo("Tom", 18, true); // output: Tom, 18, True

// 定义一个函数 Foo
void Foo(string name, int age, bool alive) =>
    Console.WriteLine($"{name},{age},{alive}");

现在我们试试命名参数来进行调用函数:

Foo(name:"Tom", age:18, alive:true); // output: Tom, 18, True

适用场景

看上面的示例感觉更麻烦了这样有意义吗?

当然有,有些函数的形参是有默认值的例如:

void Foo(string name, int age = 18, bool alive = true) =>
    Console.WriteLine($"{name},{age},{alive}");

我现在只想传输 namealive 这两个参数的时候我们可以利用命名参数来跳过传输 age 这个参数。示例:

Foo("Tom", alive:false); // output: Tom, 18, False

// 在 命名参数 后面还可以使用 位置参数 如下
Foo("Tom", age:23, true); // output: Tom, 23, True

官方文档链接:命名实参和可选实参

枚举类型的数据格式

默认情况下,枚举成员的关联常数值为类型 int;它们从零开始,并按定义文本顺序递增 1。可以显式指定任何其他整数数值类型作为枚举类型的基础类型。 还可以显式指定关联的常数值,如下面的示例所示:

enum ErrorCode : ushort
{
    None = 0,
    Unknown = 1,
    ConnectionLost = 100,
    OutlierReading = 200
}

// 又或者
enum ErrorCode : byte
{
    None = 0x01,
    Unknown,
    ConnectionLost,
    OutlierReading
}

能使用的类型有:bytesbyteshortushortintuintlongulong

详细参见官方文档:枚举类型

显式实现接口

我们知道一个类是可以继承多个接口的,但是有种情况:如果一个类实现的两个接口包含签名相同的成员这时后我们该这么办呢?

这时后我们就可以使用显式实现接口的方式来实现接口:

public interface IControl
{
    void Paint();
}

public interface ISurface
{
    void paint();
}

public class SampleClass : IControl, ISurface
{
    // 这时候 IControl 和 ISurface 的 paoint 的实现都是这个
    public void Paint()
    {
        Console.WriteLine("Paint method in SampleClass");
    }
}

调用:

SampleClass sample = new SampleClass();
IControl control = sample;
ISurface surface = sample;

// 下面几行都调用的同样的方法。
sample.Paint();
control.Paint();
surface.Paint();

但你可能不希望为这两个接口都调用相同的实现。 若要调用不同的实现,根据所使用的接口,可以显式实现接口成员。

public class SampleClass : IControl, ISurface
{
    // 显式接口实现不需要修饰符
    void IControl.Paint()
    {
        System.Console.WriteLine("IControl.Paint");
    }
    void ISurface.Paint()
    {
        System.Console.WriteLine("ISurface.Paint");
    }
}

这时候调用:

SampleClass sample = new SampleClass();
IControl control = sample;
ISurface surface = sample;

//sample.Paint(); // Compiler error.
control.Paint();
surface.Paint();

详细参见官方文档:显式接口实现

标签:里面,C#,知识,IControl,接口,sample,Paint,Tom,ISurface
From: https://www.cnblogs.com/Honesty-is-the-best-policy/p/17040763.html

相关文章

  • 解决el-date-picker组件当日历面板展开时点击清空图标无法清空问题
    问题现象:支持选择多个时间的日期组件,在日历面板展开时点击清空图标是无法清空的  解决方案:查找资料发现可以通过change事件来监听清空操作,当监听到value值为null时......
  • certutil工具使用和bypass学习
    乌鸦安全的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算......
  • docker 部署 Oracle 19c
    标签(空格分隔):Oracle系列一:系统环境介绍操作系统:centos7.9x64oracle19c配置说明:主机名:cat/etc/hosts----172.16.10.11flyfish11172.16.10.12fl......
  • C# 反射机制
    反射?就是创建对象A时,顺便把对象A的字段,函数等信息以对象的形式封装到Bs中,添加一个字符串到对象Bs的映射关系到map中,顺带封装一堆方法到Bs中,可以通过Bs创建A对象,得到A中的......
  • Activity的生命周期简述
    一、Activity的生命周期简述在讲onStart()和onResume()的区别之前,必须清楚Activity的四种状态:1.Running状态:一个新的Activity的启动入栈后,它在屏幕最前端,处于栈的最顶端,......
  • npm run dev报错TypeError: loaderContext.getResolve is not a function
    vue安装lessless-loader之后,运行项目报错:TypeError:loaderContext.getResolveisnotafunctionnpminstalllessless-loader--save之后,找到webpack.base.conf.j......
  • C++ 中的 const 限定符
    const需要与“常量”这个说法做一个区分。const就是const,常量是常量,有时候可以通用,但有时候又不能混淆。const限定符const修饰的对象的值不能被改变。可以用来提......
  • vue3 使用clodop打印插件实现不预览直接打印
    一、下载安装C-LODOPhttps://www.lodop.net/download.html   解压文件后点击exe程序,启用服务   将上述的LodopFuncs.js文件放到工程某个文件下  ......
  • jenkins执行Build Now报错系列(一)generated for lockfileVersion@2
    控制台报错如下: 主要是因为npm内的版本是lockfileVersion@1的,但是项目中用的是lockfileversion@2,因此需要升级npm,升级语句是npminstall-gnpm。我这边的npm是通过选......
  • Arcgis字段长度最大为254?
    使用数据库!参考:https://www.jianshu.com/p/9b854b1fb1e7......