using System; publicclassBank { public void ApplyInterest(ref decimal balance, decimal interestRate) { balance += balance * interestRate / 100; Console.WriteLine($"Balance after applying interest: {balance}"); } } publicclassProgram { public static void Main() { decimal accountBalance = 1000m; Bank bank = new Bank(); // 堆代码 duidaima.com Console.WriteLine($"Initial Balance: {accountBalance}"); bank.ApplyInterest(ref accountBalance, 5); Console.WriteLine($"Final Balance: {accountBalance}"); } }优点:
.必须提前初始化,不够灵活。
using System; publicclassAuthService { public bool Login(string username, string password, out string role) { if (username == "admin" && password == "1234") { role = "Administrator"; returntrue; } elseif (username == "john" && password == "pass") { role = "User"; returntrue; } else { role = "Guest"; returnfalse; } } } publicclassProgram { public static void Main() { AuthService auth = new AuthService(); if (auth.Login("admin", "1234", outstring userRole)) { Console.WriteLine($"Login successful! Role: {userRole}"); } else { Console.WriteLine("Login failed."); } } }优点:
方法必须保证给 out 参数赋值,逻辑复杂时容易漏掉,维护成本高。
using System; publicstruct Coordinates { publicdouble X { get; } publicdouble Y { get; } public Coordinates(double x, double y) { X = x; Y = y; } } publicclassGeoService { public double CalculateDistance(in Coordinates point1, in Coordinates point2) { double dx = point2.X - point1.X; double dy = point2.Y - point1.Y; return Math.Sqrt(dx * dx + dy * dy); } } publicclassProgram { public static void Main() { Coordinates location1 = new Coordinates(0, 0); Coordinates location2 = new Coordinates(3, 4); GeoService geo = new GeoService(); double distance = geo.CalculateDistance(in location1, in location2); Console.WriteLine($"Distance: {distance}"); } }优点:
.对 int、decimal 这种小类型没啥意义,反而显得啰嗦。
关键字 | 是否需要提前初始化 | 在方法内是否可修改 | 方法是否必须赋值 | 常用场景 | 优点 | 缺点 |
---|---|---|---|---|---|---|
ref | ✅ 必须 | ✅ 可修改 | ❌ 不要求 | 方法需要读取并更新变量 | 无需返回值即可修改变量 | 可能导致意外修改 |
out | ❌ 不需要 | ✅ 可修改 | ✅ 必须赋值 | 返回多个结果 | 支持多返回值 | 增加方法复杂度 |
in | ✅ 必须 | ❌ 只读 | ❌ 不要求 | 大型结构体传参 | 避免复制,性能更好 | 对小数据类型作用不大 |