传值 输出 引用 数组

C#中传值、引用与数组参数解析

值参数—>值类型:

int y;

Add(y);

void Add(int x)

值参数—>引用类型:创建新对象

 class Program
 {
     static void Main(string[] args)
     {
         Student stu = new Student() { Name="Tim"};
         SomeMethod(stu);//输出的是Tom
         Console.WriteLine(stu.Name);//输出的是Tim
     }
     static void SomeMethod(Student s)
     {
         s = new Student() { Name = "Tom" };
         Console.WriteLine(s.Name);
     }
  }

值参数—>引用类型:不创建新对象

class Program
{
    static void Main(string[] args)
    {
        Student stu = new Student() { Name="Tim"};
        UpdateObject(stu);//输出的是Tom
        Console.WriteLine(stu.Name);//输出的还是Tom
    }
    static void UpdateObject(Student s)
    {
        s.Name = "Tom" ;
        Console.WriteLine(s.Name);
    }
 }

注:

值参数创建变量副本

对值参数操作永远不影响变量的值

———————————————————————————————————————————

引用参数—>值类型:

参数和变量指向的是内存中同一个地址对参数赋新值则变量也获得新值

static void Main(string[] args)
{
    int y = 1;
    IWantSideEffect(ref y);
    Console.WriteLine(y);//y变为101

}
static void IWantSideEffect(ref int x)
{
    x = x+100;
}

——————————————————————————————————————————

引用参数—>引用类型:创建新对象

引用类型由两部分构成:值(栈中:地址)和对象(堆中:数据)

class Program
{
    static void Main(string[] args)
    {
     Student stu = new Student() { Name="Tim"};
        IWantSideEffect(ref stu);//输出Tom
        Console.WriteLine(stu.Name);//也为Tom
    }
    static void IWantSideEffect(ref Student s)
    {
     s=new Student() { Name="Tom"};
        Console.WriteLine(s.Name);
    }
    
 }

参数和方法引用的是同一个对象,为方法内部创建的新对象

如其中stu和s都引用的为 s=new Student() { Name="Tom"};这个Tom

———————————————————————————————————————————

引用参数—>引用类型:不创建新对象,只改变对象的值

 class Program
 {
     static void Main(string[] args)
     {
      Student stu = new Student() { Name="Tim"};
         Console.WriteLine(stu.Name);//输出Tim
         SomeSideEffect(ref stu);//输出为Tom
         Console.WriteLine(stu.Name);//仍为Tom
     }
     static void SomeSideEffect(ref Student s)
     {
      s.Name="Tom"
         Console.WriteLine(s.Name);
     }
     
  }

从始至终都在操纵同一个对象:是 Student stu = new Student() { Name="Tim"};这个对象

如果没有ref关键词则为值参数:效果和上面一模一样但机理不一样这种为传值函数在内存中创建了实际参数的副本,stu和s指向的是不同的内存地址,只是两个不同的内存地址中存储的东西相同即存储相同的地址:两个不同的名字指向同一个小朋友,这个小朋友牵着一个气球

 class Program
 {
     static void Main(string[] args)
     {
      Student stu = new Student() { Name="Tim"};
         Console.WriteLine(stu.Name);
         SomeSideEffect(stu);
         Console.WriteLine(stu.Name);
     }
     static void SomeSideEffect(Student s)
     {
      s.Name="Tom"
         Console.WriteLine(s.Name);
     }
     
  }

举个例子,有A,,B,C三个人,没有ref的话就是A告诉B要吃饭了,B再告诉C要吃饭了;有了ref之后就是A直接告诉C要吃饭了

传值,是复制了一把钥匙持有人的钥匙,开锁改里面的东西。引用,是拿着钥匙持有人的手,直接开锁,改里面的东西

———————————————————————————————————————————

输出参数-->值类型

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("please input first number");
        string arg1=Console.ReadLine();
        double x = 0;
        bool b1=double.TryParse(arg1, out x);
        if(b1==false)
        {
            Console.WriteLine("input error");
            return;

        }
        Console.WriteLine("please input second number");
        string arg2=Console.ReadLine();
        double y = 0;   
        bool b2=double.TryParse(arg2, out y);
        if (b2 == false)
        {
            Console.WriteLine("input error");
            return;
        }
        double z = x + y;
        Console.WriteLine("{0}+{1}={2}",x,y,z);
    }
 }

输出参数-->引用 类型

数组参数

用params修饰

  class Program
  {
      static void Main(string[] args)
      {
          
          int result=Sum(1,2,3);//不需要提前声明一个数组,会自动声明一个
          Console.WriteLine(result);
      }
      static int Sum(params int[] intarray)//用了params修饰
      {
          int sum = 0;
          foreach (var i in intarray)
          {sum += i; }
          return sum;
          }
   }

字符类型

 static void Main(string[] args)
 {
     string str = "Tim;Tom,Amy.Lisa";
     string[] result = str.Split(';', ',', '.');
     foreach (var name in result)
     {
         Console.WriteLine(name);//输出Tim Tom Amy Lisa
     }
 }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值