C# 值类型

1.传值:顾名思义在方法调用时,不改变外部变量的值,只改变方法体内部的变量值;

    static void Main()
        {

            int y = 100;
            Student ste = new Student();
            ste.CalculatorAge( y);
            Console.WriteLine(y);
            Console.ReadKey();

        }

        class Student
        {
            public void CalculatorAge( int x)
            {
                x = x + 1;
                Console.WriteLine("{0}",x);
            }

        }

输出结果: 100;
101

 

2.传址:就是将变量的存储地址传入方法体内部,改变方法体内部的变量同时改变方法体外的变量;

        static void Main()
        {

            int y = 100;
            Student ste = new Student();
            ste.CalculatorAge(ref  y);
            Console.WriteLine(y);
            Console.ReadKey(); 

        }

        class Student
        {
            public void CalculatorAge(ref int x)
            {
                x = x + 1;
                Console.WriteLine("{0}",x);
            }

        }

  输出结果:  101
             101

 

3.输出参数

   static void Main()
        {

            int y = 100;
            int x = 0;
            Student ste = new Student();
            ste.CalculatorAge( y,out x);
            Console.WriteLine(y);
            Console.WriteLine(x);
            Console.ReadKey(); 

        }

        class Student
        {
            public void CalculatorAge(int x ,out int y)
            {
                x = x + 1;
                y = x * 2;
                Console.WriteLine("{0},{1}",x,y);
            }

        }

编辑注意:在调用带输出参数的方法,是必须在方法内部用OUT标注出输出函数;

 

4.数组参数

  

        static void Main()
        {
            int[] array = new int[] { 1, 2, 3, 4, 5, 6 };
            Student ste = new Student();
            ste.CalculatorAge( array   );
            Console.ReadKey(); 

        }

        class Student
        {
            public void CalculatorAge(params  int[] var   )
            {
                if (var==null)
                {
                    
                }
                foreach (var num in var)
                {
                    Console.WriteLine(num);
                }
            }

        }
编写代码注意:
      1.在编写数组时方式需多加练习;
      2.在调用类方法时传入的数组为需求数组。

 

5.具名参数:所谓的具名参数就是类在引用时,将其内部的属性可以直接进行命名;

   对于可选参数的声明,有几个重要事项:

       5.1.不是所有的参数类型都可以作为可选参数。

  1)只要值类型的默认值在编译的时候可以确定,就可以使用值类型作为可选参数。

  2)只有在默认值是null的时候,引用类型才可以作为可选参数来使用。

  3)可选参数只能是值参数。

5.2.所有必填参数必须在可选参数声明之前声明,如果有params参数,必须在所有可选参数之后声明。

5.3.必须从可选参数列表的最后开始省略,一直到开头,否则会造成参数歧义。

5.4.若想消除参数歧义,可以结合命名参数和可选参数的特性。

        static void Main()
        {
            int[] array = new int[] { 1, 2, 3, 4, 5, 6 };
            Student ste = new Student();
           int nb= ste.CalculatorAge( x:1,y:2,z:9  );
           Console.WriteLine(nb);
            Console.ReadKey(); 

        }

        class Student
        {
            public int  CalculatorAge ( int x ,int y ,int z)
    {
                    return x*y*z;
    }
            }

            }

 

6.扩展方法:

定义:扩展方法允许现存已编译的类型和当前即将被编译的类型在不需要被直接更新的情况下,获得功能上的扩展。

为类型添加功能但并不拥有类型的已有代码时;

当需要使类型支持一系列成员但不能改动类型的原始定义时。

说明:扩展方法不会真正改变编译后的代码,只是在当前应用程序的上下文中为类型增加成员

static class MyExtensions // ①方法定义在静态类
{
      // ②扩展方法声明为静态的
      public static void DisplayDefiningAssembly (this object obj) // ③使用this关键字对第一个参数修饰
      {
           Console.WriteLine("{0} lives here:=> {1}\n",obj.GetType().Name,Assembly.GetAssembly(obj.GetType()).GetName().Name);
      }

      public static int ReverseDigits(this int i)
      { 
            // 把int翻译为string然后获取所有字符
            char[] digits = i.ToString().ToCharArray();
            // 现在反转数组中的项
            Array.Reverse(digits );
            // 放回string
            String newDigits = new string (digits );
            // 最后以int返回修改后的字符串
            return int.Parse(newDigits)
      }
}

1)必须把方法定义在静态类中

2)每个扩展方法也必须是静态的

3)所有扩展方法都需要使用this关键字对第一个参数进行修饰(只对第一个参数)

4)每个扩展方法只能被内存中正确的实例调用,或通过其所处的静态类被调用

C# 值类型

上一篇:23天设计模式之迭代器模式


下一篇:Go使用反射递归复制结构体