[Day17]C# 鸡础观念- 像个邮差一样~值与址的传递

在呼叫方法时,难免会需要传递参数,
那这些参数该如何传递呢?
在传递的过程中,究竟是传值还是传址呢?

传值/images/emoticon/emoticon30.gif

  • 在呼叫方法时我们难免需要将参数做传递
  • 值得传递,表示他们在记忆体中,会占不同的空间
  • 当值传递完成後他们之间将毫无关系

范例:我们来输入两个数字,并且将他们比大小

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CsharpDemo
{

    class Program
    {
        static void Main(string[] args)
        {
            //宣告X整数
            int x = Convert.ToInt32(Console.ReadLine());
            //宣告y整数
            int y = Convert.ToInt32(Console.ReadLine());

            //呼叫Bigger方法,并将x,y的直传入
            int reault = Bigger(x, y);

            Console.WriteLine("x = " + x + " ,y = " + y);
            Console.WriteLine("最大值为" + reault);
            Console.ReadKey();
        }

        //比较两数大小的方法,将x y 传入
        static int Bigger(int x, int y)
        {
            //判断x y谁大
            int maxValue = (x >= y) ? x : y;
            return maxValue;
        }

    }
  }

输入:

1
5

结果:

1
5
x = 1 ,y = 5
最大值为5

我们这边使用到了三元条件运算子,它的结构如下:
https://ithelp.ithome.com.tw/upload/images/20210918/20097001jjic7kGdDH.png

中断点 /images/emoticon/emoticon03.gif

  • 中断点,是debug时非常好用的一个功能
  • 如果对程序码的执行有任何疑问,基本上都是可以使用中断点做逐步执行的

中断点使用方式:

  1. 在想要停止的程序前面点一下,会出现小红点(快捷键:F9)
    https://ithelp.ithome.com.tw/upload/images/20210918/20097001fVyeIJeDkP.png

  2. 接下来我们执行程序,会发现执行到此行时程序停下来了
    https://ithelp.ithome.com.tw/upload/images/20210918/20097001a0GKCS8w0E.png

  3. 这时候我们到功能列上按逐步执行(快捷键:F11),会发现按一下就执行一行程序,这样我们就可以了解程序如何执行了
    https://ithelp.ithome.com.tw/upload/images/20220303/20097001yw7hyHsdQF.png

如果我们逐步执行程序後,会发现原来呼叫方法时,程序会先进入方法执行,执行完再回到原本程序继续执行

址的传递/images/emoticon/emoticon79.gif

  • 假设有一个拥有上百的参数的阵列,做参数的传递,等於又得在记忆体中切割一样大小的空间出来
  • 因此像阵列或结构体复杂的传递,他传的是记忆体所在的位址,而不是传递参数
  • 传递後新的阵列也会指向相同的记忆体位置,因此做任何异动时都会影响到原来的阵列

范例:我们用List来验证传址的行为吧

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CsharpDemo
{

    class Program
    {
        static void Main(string[] args)
        {
            //宣告一个Llist
            List<string> myList = new List<string>() { "孤独一只鸡", "人生一条虫", "寂寞一只鸟", "爆肝一只鹅" };
            Console.WriteLine("原始笔数 = " + myList.Count());

            //呼叫方法并传入List
            int newCount = ListCount(myList);
            Console.WriteLine("目前笔数 = " + newCount);

            //这时候我们用foreach回圈来拆解原本的List
            foreach(string item in myList)
            {
                Console.Write(item + "  ");
            }
            Console.ReadKey();
        }
        //我们使用一个方法并接收list的传递,然後回传list的笔数
        static int ListCount(List<string> newList)
        {
            //我们在这list偷偷加一只鱼
            newList.Add("高冷一只鱼");
            return newList.Count();
        }
}

结果:

原始笔数 = 4
目前笔数 = 5
孤独一只鸡 人生一条虫 寂寞一只鸟 爆肝一只鹅 高冷一只鱼

我们可以发现,我们明明在新的方法,新的List去修改List,结果原来的List却受到影响,这就是因为他们指向的记忆体位置是同一个地方,所以只要一有变动所有资料都会受到影响

以上就是我们今天小邮差的故事,我们明天见喽!


<<:  OpenStack Neutron 介绍 — OVN Plug-in 架构

>>:  Day3:进入新手村前先让我复习一下QQ-CSS-box-sizing

Day 16 AWS云端实作起手式第六弹 串接两大网路流量导流服务Route53和ELB

今天我们会把Route 53串接到昨天建置的ELB上。但开始之前,我们先问自己一个问题,Route ...

在 Debian 11 上直接用 Fcitx 5 与呒虾米

前言 Fcitx 5 是 Debian 11 预先安装好的中文输入法,目前,无法在 Debian 1...

CSS微动画 - 弹窗也要很动感,动画不能只做一半

Q: 9月的最後一天来点特别的吧? A: 常见的弹窗来一个! 样式先做好是很重要的! 首先来个简易...

Alpine Linux Porting (一点二?)

今天稍微回头update一下musl这边的porting状况。 之前遇到message queue跟...

Day 10 - Kotlin的函式

Day 10 - Kotlin的函式 不知不觉我们已经到达了第十天了,昨天讲的是when条件判断跟w...