home commit with new plugins
This commit is contained in:
+47
-40
@@ -1,48 +1,55 @@
|
||||
# ref 和 out
|
||||
通常用法:
|
||||
解决值[[值类型和引用类型]]在函数内外部互相传递时的问题
|
||||
函数内部改外部传入也改
|
||||
==ref和out的区别:==
|
||||
ref:
|
||||
- 传入的参数必须初始化(赋值)
|
||||
- 方法内可读可写
|
||||
out:
|
||||
- 传入前**可以不初始化**
|
||||
- 方法内**必须赋值**,否则编译报错
|
||||
- 解决“函数内部改了值,函数外部也要同步变化”的需求
|
||||
- 让方法可以直接操作调用方变量
|
||||
|
||||
区别:
|
||||
1. `ref`
|
||||
- 传入前必须先初始化
|
||||
- 方法内可以读,也可以写
|
||||
2. `out`
|
||||
- 传入前可以不初始化
|
||||
- 方法返回前必须赋值
|
||||
- 常用于“额外带回一个结果”
|
||||
|
||||
语法:
|
||||
在函数传参时,两边都要加上修饰词
|
||||
ref:
|
||||
```Csharp
|
||||
//交换数字
|
||||
void Swap(ref int a, ref int b)
|
||||
{
|
||||
int temp = a; a = b; b = temp;
|
||||
}
|
||||
定义和调用两边都要写关键字。
|
||||
|
||||
`ref`:
|
||||
```csharp
|
||||
void Swap(ref int a, ref int b)
|
||||
{
|
||||
int temp = a;
|
||||
a = b;
|
||||
b = temp;
|
||||
}
|
||||
|
||||
int x = 10;
|
||||
int y = 20;
|
||||
Swap(ref x, ref y);
|
||||
Console.WriteLine($"{x}, {y}"); // 20, 10
|
||||
```
|
||||
out:
|
||||
```Csharp
|
||||
//最经典:int.TryParse
|
||||
if (int.TryParse(Console.ReadLine(), out int value))
|
||||
Console.WriteLine(value % 2 == 0 ? "even" : "odd");
|
||||
//int.TryParse伪代码
|
||||
//bool ReadConfig(string key, out string value)
|
||||
//{
|
||||
// if (配置存在)
|
||||
// {
|
||||
// value = 读取到的值; return true;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// value = null; return false;
|
||||
// }
|
||||
//}
|
||||
|
||||
`out`:
|
||||
```csharp
|
||||
bool TryGetAge(string text, out int age)
|
||||
{
|
||||
return int.TryParse(text, out age);
|
||||
}
|
||||
|
||||
if (TryGetAge("18", out int value))
|
||||
{
|
||||
Console.WriteLine(value);
|
||||
}
|
||||
```
|
||||
案例:
|
||||
原型在[[值类型和引用类型]]笔记中
|
||||
|
||||
注意:
|
||||
==out不是用来让内外值一定不等==
|
||||
==ref传入的参数必须初始化==
|
||||
如果传入引用类型且内外不同,推荐new一个
|
||||
1. ==`ref` 参数必须先初始化==
|
||||
2. ==`out` 参数在方法结束前必须赋值==
|
||||
3. `ref` / `out` 传的是变量本身,所以修改会影响外部
|
||||
4. 对引用类型来说:
|
||||
- 不加 `ref` 时,方法里可以改对象内容
|
||||
- 加 `ref` 时,连“变量指向哪个对象”都可以改
|
||||
5. 属性、常量、表达式一般不能直接当 `ref` / `out` 参数传入
|
||||
|
||||
#基础
|
||||
#基础
|
||||
|
||||
+54
-39
@@ -1,46 +1,61 @@
|
||||
# 值类型和引用类型
|
||||
概念:
|
||||
==引用类型:string、数组、类==
|
||||
==值类型:剩下都是,包括数组、enum、结构体==
|
||||
|
||||
值类型默认都是0
|
||||
bool类型是false
|
||||
引用类型默认值是null
|
||||
- C# 的类型大体分成两类:==值类型== 和 ==引用类型==
|
||||
- 值类型变量通常==直接保存数据本身==
|
||||
- 引用类型变量保存的是==对象的引用(地址)==
|
||||
|
||||
常见类型:
|
||||
- 值类型:数值类型、`bool`、`char`、`enum`、`struct`
|
||||
- 引用类型:`string`、数组、类、接口、委托、`object`、`dynamic`
|
||||
|
||||
默认值:
|
||||
- 数值类型默认值一般是 `0`
|
||||
- `bool` 默认值是 `false`
|
||||
- `char` 默认值是 `'\0'`
|
||||
- `enum` 默认值是 `(枚举类型)0`
|
||||
- 引用类型默认值一般是 `null`
|
||||
|
||||
使用区别:
|
||||
值类型:在相互赋值时,把内容进行拷贝 //他变我不变
|
||||
引用类型:把相互赋值时,把==地址==进行拷贝 //他变我也变
|
||||
原因:
|
||||
值类型和引用类型 存储的内存区域不同,存取方式也不一样
|
||||
值类型:栈空间 —— 小但是快 (0GC)
|
||||
引用类型:堆空间 —— 大但是慢 (且有GC)
|
||||
1. 赋值时
|
||||
- 值类型:复制的是数据本身
|
||||
- 引用类型:复制的是引用
|
||||
2. 传参时
|
||||
- 默认也遵循上面的规则
|
||||
- 所以值类型通常是“传一份副本”
|
||||
- 引用类型通常是“传一份引用”
|
||||
|
||||
案例:
|
||||
值类型:
|
||||
```Csharp
|
||||
static void ChangeValue(int value)
|
||||
{
|
||||
value =3:
|
||||
}
|
||||
static void Main(string[] args)
|
||||
{
|
||||
int a = 1;
|
||||
ChangeValue(1);
|
||||
cw(a);
|
||||
}
|
||||
//仍然输出1
|
||||
值类型:
|
||||
```csharp
|
||||
static void ChangeValue(int value)
|
||||
{
|
||||
value = 99;
|
||||
}
|
||||
|
||||
int a = 1;
|
||||
ChangeValue(a);
|
||||
Console.WriteLine(a); // 1
|
||||
```
|
||||
引用类型:
|
||||
```Csharp
|
||||
static void ChangeValue(int[] value)
|
||||
{
|
||||
value =99:
|
||||
}
|
||||
static void Main(string[] args)
|
||||
{
|
||||
int[] a = {1};
|
||||
ChangeValue(a);
|
||||
cw(a[0]);
|
||||
}
|
||||
//输出99
|
||||
|
||||
引用类型:
|
||||
```csharp
|
||||
static void ChangeValue(int[] value)
|
||||
{
|
||||
value[0] = 99;
|
||||
}
|
||||
|
||||
int[] a = { 1 };
|
||||
ChangeValue(a);
|
||||
Console.WriteLine(a[0]); // 99
|
||||
```
|
||||
#基础
|
||||
|
||||
注意:
|
||||
1. ==数组是引用类型,不是值类型==
|
||||
2. ==string 也是引用类型==,但它有“不可变”特性
|
||||
3. “值类型在栈上、引用类型在堆上”只是初学时的简化理解,==不适合当成绝对规则==
|
||||
4. 更稳的记法是:
|
||||
- 值类型变量保存值
|
||||
- 引用类型变量保存引用
|
||||
5. 如果想让方法直接改外部变量本身,要继续看[[ref和out]]
|
||||
|
||||
#基础
|
||||
|
||||
Reference in New Issue
Block a user