C#中的OUT

C#中的OUT

out 设计初衷:不必事先初始化变量,就可以通过引用传递参数给变量。

out 标注函数参数就是为了能返回多个结果,out参数表就是输出参数表。

在调用函数中,不能用out参数做任何运算,一般只能放输出结果。

每个方法只能有一个返回值。但是你想有多个返回值,OUT就起作用了

out参数:返回值多个,不限类型

1.调用方法之前,对out参数传递的变量只需声明,可以赋值也可以不赋值,赋值也会在方法中被覆盖掉
2.使用out参数传递变量时,必须在方法内为其赋值,否则return的返回值没有意义
3.方法的参数使用out修饰时,调用该方法时也要加上out关键字
4.使用out修饰的变量不需要return      

实例1

public static bool MyTryParse(string s, out int result)
{
    result = 0;
    try
    {
        result = Convert.ToInt32(s);
        return true;
    }
    catch
    {
        return false;
    }
}
static void Main(string[] args)
{
    int n;
    bool b = MyTryParse("123", out n);
    Console.WriteLine(b);
    Console.WriteLine(n);
    Console.ReadKey();
}

实例2

public static void Test(int[] nums, out int max, out int min, out int sum, out int avg, out string s)//5个out参数修饰的是多余的返回值
{
    //out参数必须在方法内部为其赋值,否则返回去没有意义
    max = nums[0];
    min = nums[0];
    sum = 0;
    for (int i = 0; i < nums.Length; i++)
    {
        if (nums[i] > max)
        {
            max = nums[i];
        }
        if (nums[i] < min)
        {
            min = nums[i];
        }
        sum += nums[i];
    }
    avg = sum / nums.Length;
    //此方法void无返回值,无需写return
    s = "Test_Result";
}
static void Main(string[] args)
{
    int[] nums = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    int max;
    int min;
    int sum;
    int avg;
    string s;
    Test(nums, out max, out min, out sum, out avg, out s);
    Console.WriteLine(max);
    Console.WriteLine(min);
    Console.WriteLine(sum);
    Console.WriteLine(avg);
    Console.WriteLine(s);
    Console.ReadKey();
}
 

补充:ref

在这里插入图片描述

### 四、程序设计与实现 #### 4.1 程序设计与编码 ##### 1. 添加行号到文件 ```python def add_lineno_to_file(input_filename, output_filename): with open(input_filename, 'r') as fin, open(output_filename, 'w') as fout: for i, line in enumerate(fin, start=1): formatted_line = '#' + str(i).ljust(4) + line # 对齐行号至最多4位数 fout.write(formatted_line) # 调用函数,将当前 `demo.py` 文件转换为新的版本 add_lineno_to_file('demo.py', 'demo_new.py') ``` ##### 2. 生成学生成绩并统计最高成绩 ```python import random import pandas as pd # 定义函数来随机生成学生姓名、课程和成绩 def generate_student_data(num_students=10, num_courses=4): students = {'姓名': [], '课程': [], '成绩': []} for _ in range(num_students): name = f"学生{random.randint(1, 10)}" courses = random.sample(list(range(1, num_courses + 1)), random.randint(1, num_courses)) scores = [random.randint(60, 100) for _ in courses] for course, score in zip(courses, scores): students['姓名'].append(name) students['课程'].append(course) students['成绩'].append(score) return students # 生成学生数据 students_data = generate_student_data() # 转换为 DataFrame df = pd.DataFrame(students_data) df.to_excel('成绩.xlsx') # 统计每个学生每门课程的最高成绩 highest_scores = df.groupby(['姓名', '课程'])['成绩'].max().reset_index() # 将结果写入 Excel 文件 highest_scores.to_excel('最高成绩.xlsx', index=False) print("最高成绩已写入 Excel 文件") ``` ##### 3. 读取 Word 文件中的特定文本 ```python from docx import Document from docx.shared import RGBColor boldText = [] redText = [] doc = Document('1.docx') for p in doc.paragraphs: for r in p.runs: # 加粗字体 if r.bold: boldText.append(r.text) # 红色字体 if r.font.color.rgb == RGBColor(255, 0, 0): redText.append(r.text) result = { 'red text': redText, 'bold text': boldText, 'both': set(redText) & set(boldText) } # 输出结果 for title in result.keys(): print(title.center(30, '=')) for text in result[title]: print(text) ``` ##### 4. 清理磁盘垃圾文件 ```python from os.path import isdir, join, splitext, getsize from os import remove, listdir import sys filetypes = ['.tmp', '.log', '.obj', '.txt'] def delCertainFiles(directory): if not isdir(directory): return for filename in listdir(directory): temp = join(directory, filename) if isdir(temp): delCertainFiles(temp) elif splitext(temp)[1] in filetypes or getsize(temp) == 0: remove(temp) print(temp, 'deleted...') directory = sys.argv[1] delCertainFiles(directory) ``` #### 4.2 测试运行 ##### 1. 添加行号到文件 - **测试用例**: - 输入文件 `demo.py` 内容: ```python print("Hello, World!") a = 10 b = 20 c = a + b print(c) ``` - 期望输出文件 `demo_new.py` 内容: ```python #1 print("Hello, World!") #2 a = 10 #3 b = 20 #4 c = a + b #5 print(c) ``` - **测试结果**: - 生成的 `demo_new.py` 文件内容正确,行号对齐良好。 ##### 2. 生成学生成绩并统计最高成绩 - **测试用例**: - 生成10个学生的数据,每学生最多4门课程。 - 生成的数据写入 `成绩.xlsx` 文件。 - 统计每个学生每门课程的最高成绩,写入 `最高成绩.xlsx` 文件。 - **测试结果**: - `成绩.xlsx` 文件生成成功,包含随机生成的学生姓名、课程和成绩。 - `最高成绩.xlsx` 文件生成成功,包含每个学生每门课程的最高成绩。 ##### 3. 读取 Word 文件中的特定文本 - **测试用例**: - 使用包含加粗和红色文本的 Word 文件 `1.docx`。 - 读取并输出所有红色文本、加粗文本以及同时具有这两种属性的文本。 - **测试结果**: - 正确识别并输出了所有的红色文本、加粗文本以及同时具有这两种属性的文本。 ##### 4. 清理磁盘垃圾文件 - **测试用例**: - 创建一个包含多个 `.tmp`, `.log`, `.obj`, `.txt` 文件以及一些非目标文件的目录。 - 运行脚本,指定该目录作为参数。 - **测试结果**: - 目标文件被成功删除,非目标文件保留未变。 ### 五、实验总结 #### 描述完成的实验内容 本次实验主要涉及四个任务: 1. 编写一个程序,在给定文件的每一行末尾添加行号,并保持格式整齐。 2. 生成学生考试成绩数据,并统计每个学生每门课程的最高成绩,分别写入两个 Excel 文件。 3. 读取 Word 文档中的特定文本(加粗、红色、同时具有两种属性),并输出这些文本。 4. 实现一个磁盘垃圾文件清理功能,删除指定目录及其子目录中的临时文件和空文件。 #### 实现的功能和方法 1. **添加行号到文件**: - 使用 `with open` 打开文件,逐行读取并添加行号。 - 格式化行号,使其对齐。 2. **生成学生成绩并统计最高成绩**: - 使用 `pandas` 库生成和处理数据。 - 生成随机学生数据并写入 Excel 文件。 - 统计最高成绩并写入另一个 Excel 文件。 3. **读取 Word 文件中的特定文本**: - 使用 `python-docx` 库读取 Word 文件。 - 遍历段落中的 runs,提取加粗和红色文本。 4. **清理磁盘垃圾文件**: - 使用递归遍历目录,检查文件类型和大小。 - 删除符合条件的文件。 #### 结果记录 - 各个任务均按预期完成了功能。 - 生成的文件和输出结果符合要求。 - 程序运行稳定,无明显错误。 #### 实验过程中出现的问题及解决办法 1. **文件路径问题**: - **问题**:在某些情况下,文件路径可能不正确导致无法打开文件。 - **解决**:使用绝对路径或相对路径,并进行路径合法性检查。 2. **数据生成不均匀**: - **问题**:生成的学生数据分布不均匀,影响统计结果。 - **解决**:调整随机生成算法,确保数据分布合理。 3. **性能问题**: - **问题**:处理大文件时,程序运行较慢。 - **解决**:优化代码,减少不必要的计算和内存占用。 #### 其他的方法是什么,与五中的方法对比有什么问题 - **其他方法**: - 使用 `numpy` 替代 `pandas` 处理数据,可能会提高性能但代码复杂度增加。 - 使用多线程或异步处理提高文件操作效率,但会增加代码复杂性。 - **对比问题**: - 性能提升有限,但代码复杂度显著增加。 - 维护难度加大,不利于初学者理解和学习。 #### 本方法还可以如何修改 - **优化文件读写**:使用缓冲区读写文件,减少 I/O 操作次数。 - **增强异常处理**:增加更多的异常捕获和处理机制,提高程序健壮性。 - **改进用户交互**:提供图形界面,方便用户选择文件和目录。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值