zoukankan      html  css  js  c++  java
  • C#:方法参数之--值参数

    值参数:方法声明时,不带任何修饰符的形参,就被称为值参数。

    • 值参数(形参)本质上是一个局部变量,它的初始值来自方法调用时传递过来的实参
    • 值参数所在的方法被调用的时候,传递的实参必须能够隐式地转换成形参的类型
    • 值参数所在的方法被调用的时候,会将实参的值拷贝一份给形参(创建副本),这样方法调用前后,都不会对实参有影响

    值参数的类型为值类型

    static void Main(string[] args)
    {
        int x = 10;
        AddOne(x);
        Console.WriteLine(x);//10
        Console.ReadKey();
    }
    
    static void AddOne(int p)
    {
        p = p + 1;
        Console.WriteLine(p);//11
    }
    

    分析:p是值参数,调用p所在的方法时,实参的值被拷贝了一份给了形参p,所以操作p不会对x有任何影响
    值类型的值参数

    值参数的类型为引用类型

    • 在方法内部创建了新对象,赋值给形参
    class Program
    {
        static void Main(string[] args)
        {
            var stu = new Student() { Name = "xiaoming", Age = 18 };
            //对象的hashcode是唯一的 使用hashcode可以判断两个对象是否相等
            Console.WriteLine(stu.GetHashCode());//输出:46104728
            PrintInfo(stu);
            //方法调用后 实参stu的数据信息
            Console.WriteLine(stu.Name+"--"+stu.Age);//输出:xiaoming--18
            Console.Read();
        }
    
        static void PrintInfo(Student student)
        {
            student = new Student() { Name="jaychou",Age=33};
            Console.WriteLine(student.GetHashCode());//输出:12289376
            Console.WriteLine(student.Name + "--" + student.Age);//输出:jaychou--33
        }
    }
    
    class Student
    {
        public int Age { get; set; }
        public string Name { get; set; }
    }
    

    分析:值参数类型为引用类型时,实参在调用前和调用后没有发生变化
    引用类型的值参数

    • 在方法内部,只操作形参引用的对象,不创建新的对象
    class Program
    {
        static void Main(string[] args)
        {
            var stu = new Student() { Name = "xiaoming", Age = 18 };
            //对象的hashcode是唯一的 使用hashcode可以判断两个对象是否相等
            Console.WriteLine(stu.GetHashCode());//46104728
            PrintInfo(stu);
            //方法调用后 实参stu的数据信息
            Console.WriteLine(stu.Name+"--"+stu.Age);//jaychou--33
            Console.Read();
        }
    
        static void PrintInfo(Student student)
        {
            student.Name = "jaychou";
            student.Age = 33;
            Console.WriteLine(student.GetHashCode());//46104728
            Console.WriteLine(student.Name + "--" + student.Age);//jaychou--33
        }
    }
    
    class Student
    {
        public int Age { get; set; }
        public string Name { get; set; }
    }
    

    分析:从打印结果来看,调用前后实参引用的对象的hascode没有变;但是改变的引用的对象中的数据

  • 相关阅读:
    Java实现 LeetCode 382 链表随机节点
    Java实现 LeetCode 382 链表随机节点
    Java实现 LeetCode 381 O(1) 时间插入、删除和获取随机元素
    Java实现 LeetCode 381 O(1) 时间插入、删除和获取随机元素
    Java实现 LeetCode 381 O(1) 时间插入、删除和获取随机元素
    Java实现 LeetCode 380 常数时间插入、删除和获取随机元素
    Java实现 LeetCode 380 常数时间插入、删除和获取随机元素
    Linux下的iwpriv(iwlist、iwconfig)的简单应用
    OCX控件的注册卸载,以及判断是否注册
    .OCX、.dll文件注册命令Regsvr32的使用
  • 原文地址:https://www.cnblogs.com/bigbosscyb/p/13715765.html
Copyright © 2011-2022 走看看