1,可选参数和命名参数

  • 当给参数指定默认值时,可以在调用的时候省略
  • 有默认值的参数,必须放在所有没有默认值的参数后面,但是 参数数组必须放在最后面,parm
  • 默认值必须时编译时能确定的常量值,对于值类型可以用default(类型)关键字来给定。
  • 如果参数用ref或者out设定,则没法使用默认值
  • 对于有ref的参数调用,以传参数名的方式传递实参,则使用如下语法:
private static void M(ref int x){...}

int a=5;
//调用方法
M(x:ref a);
class Program
{
private static int s_n = 0;
private static void M(int x=9,string s ="A",DateTime dt=default(DateTime),Guid guid=new Guid())
{
Console.WriteLine("x={0},s={1},dt={2},guid={3}", x, s, dt, guid);
}
static void Main(string[] args)
{
M();
M(8, "X");
M(5, guid: Guid.NewGuid(), dt: DateTime.Now);
M(s_n++, s_n++.ToString());
M(s: s_n++.ToString(), x: s_n++);
Console.ReadKey();
}
} //-----------------------------结果
x=9,s=A,dt=0001/1/1 0:00:00,guid=00000000-0000-0000-0000-000000000000
x=8,s=X,dt=0001/1/1 0:00:00,guid=00000000-0000-0000-0000-000000000000
x=5,s=A,dt=2020/1/30 9:47:08,guid=89e5fcd4-2a7f-4872-968e-756a4dfa9531
x=0,s=1,dt=0001/1/1 0:00:00,guid=00000000-0000-0000-0000-000000000000
x=3,s=2,dt=0001/1/1 0:00:00,guid=00000000-0000-0000-0000-000000000000

2,DefaultParameterValueAttribute 和 OptionAttribute----------IL代码读懂IL指令大全

3,参数传递方式

  • 传值(默认),注意,传递引用本身时传值的。相当于传递了一个指针的副本。
  • 传引用,使用ref,out关键字,则传递的实际时参数的地址,而不是一个副本。
  • ref和out方法的区别:
  •  private static void GetVal(out int v)
    {
    v = 10;
    }
    private static void callGetVal()
    {
    int x;//可以不必初始化
    GetVal(out x);//但是在函数内部必须初始化。
    Console.WriteLine(x);
    }
     private static void GetVal(ref int v)
    {
    v += 10;
    }
    private static void callGetVal()
    {
    int x=5;//必须初始化。否则报错errorCS0165使用未赋值局部变量x;
    GetVal(ref x);//在函数内部不必初始化。
    Console.WriteLine(x);
    }
    • 对于ref或者out关键字最大的区别在于初始化的位置,ref必须在方法的外部,out 则必须在方法内部初始化。
    • 考虑 以下代码,就知道区别了。
    • public class RefUsedType
      {
      public string value { get; set; }
      public RefUsedType(string value)
      {
      this.value = value;
      }
      public static void deal(ref RefUsedType r1)
      {
      r1 = new RefUsedType("r2");
      }
      public static void deal( RefUsedType r1)
      {
      r1 = new RefUsedType("r2");
      }
      }
      public static void callRef()
      {
      var r1 = new RefUsedType("r1");
      RefUsedType.deal(r1);
      Console.WriteLine(r1.value);
      RefUsedType.deal(ref r1);
      Console.WriteLine(r1.value); }
      //运行结果:
      r1//表明传值的方式---方法(被调用者,callee)不会改变调用者(callee)的实参的值---对于引用对象,则表现为其指向的对象永远不变(但是被调用者可以改变对象的内容,比如对象的属性,对象的字段等)r2//表面传引用的方式---方法会改变调用者的实参的值。相当于C++中的引用(@),对于引用对象,可以令其指向新对象或者为Null;

操作符重载的版本

public class RefUsedType
{
public string value { get; set; }
public RefUsedType(string value)
{
this.value = value;
}
public static void deal(ref RefUsedType r1)
{
r1 = "r2";
}
public static void deal( RefUsedType r1)
{
r1 = "r2";
}
public static implicit operator RefUsedType(string value)
{
return new RefUsedType(value);
}
}
public static void callRef()
{
RefUsedType r1 = "r1";
RefUsedType.deal(r1);
Console.WriteLine(r1.value);
RefUsedType.deal(ref r1);
Console.WriteLine(r1.value); }

4,对象和集合初始化器

Employee e = new Employee(){Name="abc",Age=5}

可以简化为

Employee e = new Employee{Name="abc",Age=5}
List<string> ls = new List<string>{"s1","s2","s3"}的方式进行创建。
//并且,其支持上下文操作:
//比如
List<string> ls = new List<string>{"s1","s2","s3"}.ForEach(x=>x.console.writeline(x));

用于初始化类实列。

当类是一个集合类的时候,还支持类似上面的用法

匿名类型

var o1 = new {Name ="absd",year="dss"};

5,有参属性

public class BitArray
{
private byte[] m_byteArray;
private int m_numBits;
public BitArray(int numBits)
{
if (numBits <= 0)
throw new ArgumentOutOfRangeException("numBits must be >0");
m_numBits = numBits;
m_byteArray = new byte[(numBits + 7) / 8];//如何建立容纳N个位的字
}
public bool this[int bitPos]//索引器
{
get
{
if ((bitPos < 0) || (bitPos > m_numBits))
throw new ArgumentOutOfRangeException("bitpos");
return (((m_byteArray[bitPos / 8]) & (1 << (bitPos % 8))))!=0;//如何查看第N位的状态。
}
set
{
if ((bitPos < 0) || (bitPos > m_numBits))
throw new ArgumentOutOfRangeException("bitpos");
if (value)
{
m_byteArray[bitPos / 8] = (byte)
((m_byteArray[bitPos / 8]) | (1 << (bitPos % 8)));//如何设ON第N位
}
else
{
m_byteArray[bitPos / 8] = (byte)
((m_byteArray[bitPos / 8]) & ~(1 << (bitPos % 8)));如何设OFF第N位
}
}
}
}
public static void call_bitArray()
{
var b1 = new BitArray(18);
b1[13] = true;
for (var i = 0; i < 18; i++)
{
if (b1[i])
Console.WriteLine("on");
else
Console.WriteLine("off");
}
}//结果off----第0位
off
off
off
off
off
off
off
off
off
off
off
off
on----第13位
off
off
off
off

clr via c# 参数和属性的更多相关文章

  1. 机器学习实战基础(三十七):随机森林 (四)之 RandomForestRegressor 重要参数,属性与接口

    RandomForestRegressor class sklearn.ensemble.RandomForestRegressor (n_estimators=’warn’, criterion=’ ...

  2. CLR via C#深解笔记四 - 方法、参数、属性

    实例构造器和类(引用类型) 构造器(constructor)是允许将类型的实例初始化为良好状态的一种特殊方法.构造器方法在“方法定义元数据表”中始终叫.ctor. 创建一个引用类型的实例时: #1, ...

  3. JQGrid 参数、属性API

    JQGrid是一个在jquery基础上做的一个表格控件,以ajax的方式和服务器端通信. JQGrid Demo 是一个在线的演示项目.在这里,可以知道jqgrid可以做什么事情. 下面是转自其他人b ...

  4. MyBatis拦截器:给参数对象属性赋值

    该拦截器的作用:在进行增加.修改等操作时,给数据模型的一些通用操作属性(如:创建人.创建时间.修改人.修改时间等)自动赋值. 该实现是在DAO层拦截,即存入DB前最后一层.后经分析,不是很合理,改为在 ...

  5. React+Three.js——PerspectiveCamera透视相机camera参数以及属性值探索

    因项目问题,对webgl进行了探索,当进行到3d相机时,对camera的up,position属性有部分难以理解的地方,因此做下了记录. 代码如下: import React, {Component} ...

  6. 机器学习实战基础(二十五):sklearn中的降维算法PCA和SVD(六) 重要接口,参数和属性总结

    到现在,我们已经完成了对PCA的讲解.我们讲解了重要参数参数n_components,svd_solver,random_state,讲解了三个重要属性:components_, explained_ ...

  7. C#利用lambda表达式将函数作为参数或属性跨类传递

    在编码时,由于开始是在winform下进行简单的测试开发的,后来代码多了,就想分到不同的类里边去,可是因为原来的测试是在同一个form下的,所以对于函数调用可以很方便,而一旦跨类之后,就会发现,这函数 ...

  8. JQ.ajax 各种参数及属性设置 ( 转载 )

    $.ajax({      type: "post",      url: url,      dataType:'html',      success: function(da ...

  9. highcharts图表史上最全的参数配置(属性+事件)

    今天这里将给大家全全展现相关的参数配置: chart.events.addSeries:添加数列到图表中. chart.events.click:整个图表的绘图区上所发生的点击事件. chart.ev ...

随机推荐

  1. Python的条件控制及循环

    一.条件控制: 1.If语句的使用: Python中if语句的一般形式如下所示: 上图中: 如果 "score>=90" 为 True 将执行 "print(‘优秀 ...

  2. C#反射与特性(四):实例化类型

    目录 1,实例化类型 1.1 Activator.CreateInstance() 1.2 ConstructorInfo.Invoke() 2,实例化委托 3,实例化泛型类型 3.1 实例化泛型 3 ...

  3. C#服务端的GET、POST请求

    一.HttpClient方式,程序集 System.Net.Http.dll GET: HttpClient httpClient = new HttpClient(); string result ...

  4. jQuery学习总结(三)

    这篇文章讲的是jQuery里的ajax发送data的三种方式,利用ajax发送数据的好处是把数据发送到了servlet后,当前页面不进行跳转. jQuery的里的ajax发送data的方式主要有三种, ...

  5. SqlServer 利用游标批量更新数据

    SqlServer 利用游标批量更新数据 Intro 游标在有时候会很有用,在更新一部分不多的数据时,可以很方便的更新数据,不需要再写一个小工具来做了,直接写 SQL 就可以了 Sample 下面来看 ...

  6. 暑假第七周总结(安装MongoDB和Tomcat以及MongoDB进行编程实践)

    本周主要对MongoDB和Tomcat进行了安装,两项安装都遇到了一些问题.其中在对MongoDB安装过程中出现了什么没有秘钥安全证书的,最终找了一堆教程重复了好多遍之后安装成功,虽然在启动和关闭的时 ...

  7. 最新2.7版本丨DataPipeline数据融合产品最新版本发布

    此次发布的2.7版本在进一步优化产品底层数据处理逻辑的同时更加注重提升用户在数据融合任务的日常管理.运行监控及资源分配等管理方面的功能增强与优化,力求帮助大家更为直观.便捷.稳定地管理数据融合任务,提 ...

  8. python day02练习和作业

    # 1.请用代码实现:利用下划线将列表的每一个元素拼接成字符串,li=[‘alex’, ‘eric’, ‘rain’]# li=['alex','eric','rain']# print('_'.jo ...

  9. Spring注入bean的方式

    在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入  这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式).   使用属性的se ...

  10. 有道词典 Andriod 版本数据格式分析

    其实很简单无聊 基于版本 5.3 分析. 其实也简单分析了有道词典iOS版本,必应词典的各个版本,以及金山词典的各个版本,还有那个一直逍遥法外的林格斯词典. 由于在各个平台上的限制,同一词典的不同版本 ...