C#語言入門詳解(18)傳值、輸出、引用、數組、具名、可選參數、擴展方法

C#語言入門詳解(18)傳值、輸出、引用、數組、具名、可選參數、擴展方法

  • 一、傳值參數
    • 1. 值類型
    • 2. 引用類型,并且創建對象
    • 3. 引用類型,不創建對象
  • 二、引用參數
    • 1. 值類型
    • 2. 引用類型,創建新對象
    • 3. 引用類型,不創建新對象
  • 三、輸出形參
    • 1. 值類型
    • 2. 引用類型
  • 四、數組參數
  • 五、具名參數
  • 六、可選參數
  • 七、擴展方法
  • 總結

內容來自劉鐵猛C#語言入門詳解課程。
參考文檔:CSharp language specification 5.0 中文版在這里插入圖片描述
在這里插入圖片描述

一、傳值參數

1. 值類型

  • 聲明時不帶修飾符的形參是值形參。 一個值形參對應于一個局部變量, 只是它的初始值來自該方法調用所提供的相應實參
    當形參是值形參時, 方法調用中的對應實參必須是表達式, 并且它的類型可以隱式轉換為形參的類型。
    允許方法將新值賦給值參數。 這樣的賦值只影響由該值形參表示的局部存儲位置, 而不會影響在方法調用時由調用方給出的實參
    在這里插入圖片描述
namespace ParametersExample
{class Program{static void Main{string[] args)Student stu = new Student()int y= 100;stu.AddOne(y);Console.WriteLine(y);
}class Student{public void AddOne(int x)x = x+ 1;Console.WriteLine(x):}

2. 引用類型,并且創建對象

在這里插入圖片描述

  • 引用參數很少使用,一般情況都是傳進來引用它的值,而不是連接到新對象去(基本只有面試題會考這個)。
  • 注:當參數類型為 string 時,在方法內部修改參數的值,對應的是此處創建對象這種情況。
    因為 string 是 immutable 的,所以在方法內部對 string 賦值實際是“創建新的 string 實例再賦值”,最終方法外部的 string 并不會改變。
  • Object.GetHashCode() 方法,用于獲取當前對象的哈希代碼,引每個對象的 Hash Code 都不一樣,可通過 Hash Code 來區分兩個 Name 相同的 stu 對象。
class Program
{static void Main(string[] args){var stu = new Student() { Name="Tim"};SomeMethod(stu);Console.WriteLine(stu.Name);Console.WriteLine(stu.GetHashCode());}static void SomeMethod(Student stu){//通過new修改指向地址stu = new Student { Name = "Tim" };Console.WriteLine(stu.Name);Console.WriteLine(stu.GetHashCode());}
}class Student
{public string Name { get; set; }
}

3. 引用類型,不創建對象

在這里插入圖片描述

  • 這種通過傳遞進來的參數修改其引用對象的值的情況,在使用中比較少見。因為作為方法,其主要輸出還是靠返回值。我們把這種修改參數所引用對象的值的操作叫做方法的副作用(side-effect),這種副作用平時編程時要盡量避免。
namespace ParametersExample
{class Program{static void Main(string[] args){Student stu = new Student() { Name = "Tim” };UpdateObject(stu);Console.WriteLine["HashCode={0}, Name-{1}", stu.GetHashCode(), stu.Name);}static void UpdateObject(Student stu){stu.Name="Tom";//副作用,side-effectConsole.WriteLine["HashCode-{0}, Name={1}", stu.GetHashCodel), stu.Name);}}
}

二、引用參數

1. 值類型

在這里插入圖片描述

  • 引用形參是用 ref 修飾符聲明的形參。 與值形參不同, 引用形參并不創建新的存儲位置。相反,引用形參表示的存儲位置恰是在方法調用中作為實參給出的那個變量所表示的存儲位置。
  • 當形參為引用形參時,方法調用中的對應實參必須由關鍵字 ref 并后接一個與形參類型相同的 variablereference組成。 變量在可以作為引用形參傳遞之前, 必須先明確賦值。
  • 在方法內部, 引用形參始終被認為是明確賦值的。
static void Main(string[] args)
{int y = 1;IWantSideEffect(ref y);Console.WriteLine(y);
}static void IWantSideEffect(ref int x)
{x += 100;
}

2. 引用類型,創建新對象

在這里插入圖片描述

class Program
{static void Main(string[] args){var outterStu = new Student() { Name = "Tim" };Console.WriteLine("HashCode={0}, Name={1}", outterStu.GetHashCode(), outterStu.Name);Console.WriteLine("-----------------");IWantSideEffect(ref outterStu);Console.WriteLine("HashCode={0}, Name={1}", outterStu.GetHashCode(), outterStu.Name);}static void IWantSideEffect(ref Student stu){stu = new Student() { Name = "Tom" };Console.WriteLine("HashCode={0}, Name={1}",stu.GetHashCode(),stu.Name);}
}class Student
{public string Name { get; set; }
}

在這里插入圖片描述

3. 引用類型,不創建新對象

在這里插入圖片描述

class Program
{static void Main(string[] args){var outterStu = new Student() { Name = "Tim" };Console.WriteLine("HashCode={0}, Name={1}", outterStu.GetHashCode(), outterStu.Name);Console.WriteLine("-----------------");SomeSideEffect(ref outterStu);Console.WriteLine("HashCode={0}, Name={1}", outterStu.GetHashCode(), outterStu.Name);}static void SomeSideEffect(ref Student stu){stu.Name = "Tom";Console.WriteLine("HashCode={0}, Name={1}", stu.GetHashCode(), stu.Name);}
}class Student
{public string Name { get; set; }
}

在這里插入圖片描述

三、輸出形參

  • 用 out 修飾符聲明的形參是輸出形參。類似于引用形參,輸出形參不創建新的存儲位置。相反,輸出形參表示的存儲位置恰是在該方法調用中作為實參給出的那個變量所表示的存儲位置。
  • 當形參為輸出形參時,方法調用中的相應實參必須由關鍵字 out 并后接一個與形參類型相同的 variablereference(第 5.3.3 節) 組成。變量在可以作為輸出形參傳遞之前不一定需要明確賦值,但是在將變量作為輸出形參傳遞的調用之后, 該變量被認為是明確賦值的。
  • 在方法內部,與局部變量相同,輸出形參最初被認為是未賦值的,因而必須在使用它的值之前明確賦值。
  • 在方法返回之前,該方法的每個輸出形參都必須明確賦值。聲明為分部方法或迭代器的方法不能有輸出形參。

1. 值類型

在這里插入圖片描述

static void Main(string[] args)
{Console.WriteLine("Please input first number:");var arg1 = Console.ReadLine();double x = 0;if (double.TryParse(arg1, out x) == false){Console.WriteLine("Input error!");return;}Console.WriteLine("Please input second number:");var arg2 = Console.ReadLine();double y = 0;if (double.TryParse(arg2, out y) == false){Console.WriteLine("Input error!");return;}double z = x + y;Console.WriteLine(z);
}
  • 實現帶有輸出參數的TryParse:
class Program
{static void Main(string[] args){double x = 0;if(DoubleParser.TryParse("aa",out x)){Console.WriteLine(x);}}
}class DoubleParser
{public static bool TryParse(string input,out double result){try{result = double.Parse(input);return true;}catch{result = 0;return false;}}
}

2. 引用類型

在這里插入圖片描述

  • 引用類型的輸出參數實例
class Program
{static void Main(string[] args){Student stu = null;if(StudentFactory.Create("Tim", 34, out stu)){Console.WriteLine("Student {0}, age is {1}",stu.Name,stu.Age);}}
}class Student
{public int Age { get; set; }public string Name { get; set; }
}class StudentFactory
{public static bool Create(string stuName,int stuAge,out Student result){result = null;if (string.IsNullOrEmpty(stuName)){return false;}if (stuAge < 20 || stuAge > 80){return false;}result = new Student() { Name = stuName, Age = stuAge };return true;}
}

四、數組參數

在這里插入圖片描述

  • params會自動聲明一個數組,將給出值傳入數組并傳給函數。常用的writeLine / Split即為數組函數,先將參數傳入object / char數組,再傳給writeLine / Split函數。
  • 參數列表只允許有一個params參數,且必須放在最后的位置。
class Program
{static void Main(string[] args){var myIntArray = new int[] { 1, 2, 3 };int result = CalculateSum(myIntArray);Console.WriteLine(result);}static int CalculateSum(int[] intArray){int sum = 0;foreach (var item in intArray){sum += item;}return sum;}
}

等同于下面代碼

class Program
{static void Main(string[] args){int result = CalculateSum(1, 2, 3);Console.WriteLine(result);}static int CalculateSum(params int[] intArray){int sum = 0;foreach (var item in intArray){sum += item;}return sum;}
}
  • WriteLine / Split示例
    在這里插入圖片描述
    在這里插入圖片描述

五、具名參數

在這里插入圖片描述

  • 具名參數能提高代碼的可讀性
  • 不再受參數列表順序的限制
class Program
{static void Main(string[] args){PrintInfo("Tim", 34);PrintInfo(age: 24, name:"Wonder");}static void PrintInfo(string name, int age){Console.WriteLine("Helllo {0}, you are {1}.",name,age);}
}

六、可選參數

在這里插入圖片描述

  • 參數因為具有默認值而變得“可選”
  • 不推薦使用可選參數
class Program
{static void Main{string[] args){Printinfo();}
}static void Printinfo(string name = "Tim", int age = 34){Console.WriteLine("Hello {O}, you are {1}.", name, age);}

七、擴展方法

在這里插入圖片描述
當無法對原始類進行修改時,可通過擴展方法為目標數據類型追加方法。擴展方法參數列表里第一個由this修飾,即為該參數數據類型的擴展方法。

  • 無擴展方法:
class Program
{static void Main(string[] args){double x = 3.14159;// double 類型本身沒有 Round 方法,只能使用 Math.Round。double y = Math.Round(x, 4);Console.WriteLine(y);}
}
  • 有擴展方法:
class Program
{static void Main(string[] args){double x = 3.14159;// double 類型本身沒有 Round 方法,只能使用 Math.Round。double y = x.Round(4);Console.WriteLine(y);}
}static class DoubleExtension
{public static double Round(this double input,int digits){return Math.Round(input, digits);}
}

在這里插入圖片描述

  • LINQ實例
class Program
{static void Main(string[] args){var myList = new List<int>(){ 11, 12, 9, 14, 15 };//bool result = AllGreaterThanTen(myList);// 這里的 All 就是一個擴展方法bool result = myList.All(i => i > 10);Console.WriteLine(result);}static bool AllGreaterThanTen(List<int> intList){foreach (var item in intList){if (item <= 10){return false;}}return true;}
}

List所使用的All方法即為擴展方法,位于Linq命名空間下Enumrable靜態類中。
在這里插入圖片描述

總結

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98669.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98669.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98669.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

模型部署:(二)安卓端部署Yolov5-v6.0目標檢測項目全流程記錄

模型部署&#xff1a;&#xff08;二&#xff09;安卓端部署Yolov5-v6.0目標檢測項目全流程記錄1、下載NCNN項目2、下載基于安卓的yolov5項目3、修改相應的配置文件4、將項目打包成apk包5、部署自己訓練的yolov5模型6、相關資料下載&#xff1a;1、下載NCNN項目 # 鏈接地址 ht…

圖形基礎算法:如何將點與帶曲線邊的多邊形位置關系算法做穩定

簡介判斷點與多邊形位置關系算法是幾何算法中最基礎的算法之一&#xff0c;包括布爾運算在內的非常非常多的算法都會用到它。它的穩定是算法庫穩定的關鍵。下面我們從一個邊都是直線的多邊形開始了解射線法的原理。然后看看引入曲線后會帶來哪些問題&#xff0c;以及在實際應用…

react的filber架構

好問題 &#x1f44d; 你問的是 React Fiber 架構。這是 React 16 引入的核心機制&#xff0c;用來解決 React 在大規模更新時的性能問題。下面我給你從 背景 → Fiber 是什么 → 原理 → 優點 → 流程 來系統講。一、為什么需要 Fiber&#xff1f;在 React 15 及以前&#xff…

Lucky STUN穿透結合群暉NAS實現docker下transmission監聽端口動態更新

參考文章 LCUKY系列教程 一 「LUCKY STUN穿透」使用 cURL 自動修改 Transmission 的監聽端口 二 「LUCKY STUN穿透」使用 Webhook 自動修改 qbittorrent 的監聽端口 三 LUCKY STUN穿透在Windows上使用UPnP工具為BT客戶端自動添加內外端口號不同的映射規則 四「LUCKY STUN穿透」…

如何在Ubuntu暢玩鳴潮等游戲

本教程只包括Steam上的游戲。# 更新軟件源 sudo apt update # 安裝Steam sudo apt install steam首先&#xff0c;在Ubuntu的snap商店安裝Steam&#xff0c;啟動&#xff0c;登陸&#xff0c;下載游戲。到這里的操作都比較簡單&#xff0c;對于沒有反作弊的游戲&#xff0c;往往…

機器學習09——聚類(聚類性能度量、K均值聚類、層次聚類)

上一章&#xff1a;機器學習08——集成學習 下一章&#xff1a;機器學習10——降維與度量學習 機器學習實戰項目&#xff1a;【從 0 到 1 落地】機器學習實操項目目錄&#xff1a;覆蓋入門到進階&#xff0c;大學生就業 / 競賽必備 文章目錄一、聚類任務&#xff08;無監督學習…

解決 Docker 構建中 Python 依賴沖突的完整指南

問題背景 在基于 registry.cn-shenzhen.aliyuncs.com/all_dev/dev:invoice-base 鏡像構建 Docker 容器時,我們遇到了一個常見的 Python 依賴管理問題: ERROR: ResolutionImpossible: for help visit https://pip.pypa.io/en/latest/topics/dependency-resolution/#dealing-…

光子計算芯片實戰:Lightmatter Passage互連架構性能評測

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 摘要 隨著人工智能計算需求呈指數級增長&#xff0c;傳統電子計算…

基于樹莓派與Jetson Nano集群的實驗邊緣設備上視覺語言模型(VLMs)的性能評估與實踐探索

概述 2018年&#xff0c;TensorFlow Lite團隊的Pete Warden曾提出&#xff1a;“機器學習的未來在于微型化”。如今&#xff0c;隨著人工智能向高性能視覺強大的視覺語言模型&#xff08;Vision-language models, VLMs&#xff09;發展&#xff0c;對高性能計算資源的需求急劇…

華為Ai崗機考20250903完整真題

華為Ai崗機考20250903 華為自26屆秋招&#xff08;2025年起&#xff09;對AI崗位機考進行了改革&#xff0c;考試題型調整為20道選擇題&#xff08;15道單選(6分)5道不定項選擇(12分)&#xff09;2道編程題(150300)。 題目核心圍繞人工智能技術&#xff08;如Transformer架構…

k8s+jenkins+harbor構建Devops平臺

一、環境準備1、準備一主一從k8s機器&#xff0c;&#xff08;設備好可以一主多從也行&#xff09;2、一臺harbor倉庫機器&#xff08;dockerhub訪問不了&#xff09;二、安裝nfs服務1、在k8s機器上yum install nfs-utils -y systemctl start nfs systemctl enable nfs2、創建共…

為什么 socket.io 客戶端在瀏覽器能連上,但在 Node.js 中報錯 transport close?

網羅開發&#xff08;小紅書、快手、視頻號同名&#xff09;大家好&#xff0c;我是 展菲&#xff0c;目前在上市企業從事人工智能項目研發管理工作&#xff0c;平時熱衷于分享各種編程領域的軟硬技能知識以及前沿技術&#xff0c;包括iOS、前端、Harmony OS、Java、Python等方…

人才教育導向下:老年生活照護實訓室助力提升學生老年照護服務能力

一、老年生活照護實訓室建設背景與意義 &#xff08;一&#xff09;適應老齡化社會需求 我國老齡化程度持續加深&#xff0c;老年照護服務人才缺口不斷擴大。培養專業照護人才成為當務之急&#xff0c;職業教育需承擔重要責任。點擊獲取實訓室建設方案 &#xff08;二&…

我在嘉順達藍海的安全堅守

作為嘉順達藍海的資深安全員&#xff0c;每天清晨 6 點&#xff0c;我都會站在物流基地的入口處&#xff0c;看著一隊隊橙色的嘉順達藍海危險品運輸車整齊列隊。那抹醒目的橙色&#xff0c;不僅是嘉順達藍海的標志&#xff0c;更是我和 200 多名同事堅守 12 年的安全承諾。今天…

云原生監控系統 Prometheus大總結 20250909

本章內容如下&#xff1a; Prometheus 介紹 Prometheus 部署和配置 Node Exporter 采集數據 Pushgateway 采集數據 PromQL 查詢語言 Grafana 圖形化展示 Prometheus 標簽管理 Prometheus 告警機制 Prometheus 服務發現 各種Exporter 高級功能 Prometheus 實現容器監控 Promethe…

EPNN:基于嵌入式偏振神經網絡的水下成像增強方法(未做完)

Enhancing Underwater Imaging for Robot through Embedded Polarization Neural Network EPNN:基于嵌入式偏振神經網絡的水下成像增強方法 1 論文核心概念 本文提出了一種名為嵌入式偏振神經網絡(Embedded Polarization Neural Network, EPNN) 的方法,用于顯著提升水下…

基于單片機冷藏運輸車環境檢測/水產品運輸環境檢測設計

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;單片機作品題目速選一覽表&#x1f680; &#x1f449;&#x1f449;&#x1f449;&#x1f449;單片機作品題目功能速覽&#x1f680; &#x1f525;更多文章戳&#x1f449;小新單片機-CSDN博客&#x1f68…

基于STM32設計的人體健康監護系統(華為云IOT)_280

文章目錄 一、前言 1.1 項目介紹 【1】項目開發背景 【2】設計實現的功能 【3】項目硬件模塊組成 【4】設計意義 【5】國內外研究現狀 【6】摘要 1.2 設計思路 1.3 系統功能總結 1.4 開發工具的選擇 【1】設備端開發 【2】上位機開發 1.5 參考文獻 1.6 系統框架圖 1.7 系統原理…

先買實現煩過

#include <myhead.h> #define ERR_LOG(msg)do{perror(msg);printf("%d %s %s\n",__LINE__,__func__,__FILE__);}while(0) //定義TFTP默認端口號&#xff08;69&#xff09;和數據包大小&#xff08;516字節&#xff09; #define PORT 69 #define N 516 …

ACD智能分配:輪流分配和排序上限分配的設置

在客戶服務中&#xff0c;合理的對話分配是提高服務質量的關鍵。一洽客服系統針對不同業務場景,提供靈活的客服分配策略,幫助企業實現智能化的客戶服務管理&#xff0c;今天我們了解一下對話的輪流分配、排序上限分配、排序優先分配的設置一、輪流分配按照客服登錄系統的先后順…