(原创)c#学习笔记06--函数02--变量的作用域02--参数和返回值与全局数据

6.2.2  参数和返回值与全局数据

  本节将详细介绍如何通过全局数据以及参数和返回值与函数交换数据。先看看下面的代码:

class Program
{
    static void ShowDouble(ref int val)
    {
        val *= 2;
        Console.WriteLine("val doubled = {0}", val);
    } 

    static void Main(string[] args)
    {
        int val = 5;
        Console.WriteLine("val = {0}", val);
        ShowDouble(ref val);
        Console.WriteLine("val = {0}", val);
    }
} 

  和下面的代码比较:

class Program
{
    static int val;
    static void ShowDouble()
    {
        val *= 2;
        Console.WriteLine("val doubled = {0}", val);
    } 

    static void Main(string[] args)
    {
        val = 5;
        Console.WriteLine("val = {0}", val);
        ShowDouble();
        Console.WriteLine("val = {0}", val);
    }
}

  这两个ShowDouble()函数的结果是相同的。

  首先,在第一次讨论这个问题时,使用全局值的ShowDouble()版本只使用全局变量val。为了使用这个版本,就必理使用这个全局变量。这会对该函数的多样性有轻微的限制,如果要存储结果,就必须总是把这个全局变量值复制到其他变量中。另外,全局数据可以在应用程序的其他地方由代码修改,这会导致预料不到的结果(其值可能会改变,等我们认识到这点时为时已晚)。

  但是,损失了多样性常常是有好处的。我们常常希望把一个函数只用于一个目的,使用全局数据存储能减少在函数调用中犯错的可能性,例如把它传递给错误的变量。

  当然,也可以说,这种简化实际上使代码更难理解。显式指定参数可以一眼看出发生了什么改变。如FunctionName(val1, out val2)函数调用,其中val1和val2都是要考虑的重要变量,在函数执行结束后,val2就全被赋予一个新值。反之,如果这个函数不带参数,就不能对它处理了什么数据。

  总之,可以自由选择使用哪种技术来交换数据。一般情况下,最好使用参数,而不使用全局数据,但有时使用全局数据更合适,使用这种技术并没有错。

时间: 2024-10-12 18:57:57

(原创)c#学习笔记06--函数02--变量的作用域02--参数和返回值与全局数据的相关文章

(原创)c#学习笔记06--函数02--变量的作用域01--其他结构中变量的作用域

6.2  变量的作用域 在上一节中,读者可能想知道为什么需要利用函数交换数据.原因是C#中的变量仅能从代码的本地作用域访问.给定的变量有一个作用域,访问该变量要通过这个作用域来实现. 在上一节中,读者可能想知道为什么需要利用函数交换数据.原因是C#中的变量仅能从代码的本地作用域访问.给定的变量有一个作用域,访问该变量要通过这个作用域来实现.代码如下: class Program { static void Write() { Console.WriteLine("myString = {0}&q

11-黑马程序员------C 语言学习笔记---C语言的变量的作用域和储存类型

黑马程序员------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 五 变量的作用域和储存类型 01 变量的作用域是指该变量有效地区域,C语言中得变量分为局部变量和全局变量. 02 局部变量: *局部变量的作用域仅限于定义它的代码块内,离开代码块内便失去作用. *形参只有在函数内有效,其也属于局

JavaScript高级程序设计学习笔记第四章--变量、作用域和内存问题

1.变量可能包含两种不同数据类型的值:基本类型值和引用类型值. 基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象. 2.变量复制 如果从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上,两个变量可以参与任何操作而不会相互影响. 当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中.不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象.复制操作结束

MySQL学习笔记—自定义函数

MySQL学习笔记-自定义函数 注释语法: MySQL服务器支持3种注释风格: 从'#'字符从行尾. 从'– '序列到行尾.请注意'– '(双破折号)注释风格要求第2个破折号后面至少跟一个空格符(例如空格.tab.换行符等等).该语法与标准SQL注释语法稍有不同. 从/序列到后面的/序列.结束序列不一定在同一行中,因此该语法允许注释跨越多行. 下面的例子显示了3种风格的注释: mysql> SELECT 1+1; # This comment continues to the end of li

python学习笔记之函数总结--高阶函数以及装饰器

python学习笔记之函数总结--高阶函数以及装饰器 Python特点: 1.不是纯函数式编程(允许变量存在): 2.支持高阶函数(可以传入函数作为变量): 3.支持闭包(可以返回函数): 4.有限度的支持匿名函数: 高阶函数: 1.变量可以指向函数: 2.函数的参数可以接收变量: 3.一个函数可以接收另一个函数作为参数: 下面我将示例一些函数的写法以及使用,并说明python中函数的特性: 1.基本的高阶函数示例: #!/usr/bin/env python def func():      

javascript学习笔记---ECMAScript语法(变量)

变量声明关键字var: var i = 1: var t = "asd"; var test1 = "hi", test2 = "hello"; 声明变量不一定要初始化, var i;//ok 另一方面在使用变量前若未加关键字var,则此变量为全局变量(此特性需特别记住). 变量名字: 变量名需要遵守两条简单的规则: 第一个字符必须是字母.下划线(_)或美元符号($) 余下的字符可以是下划线.美元符号或任何字母或数字字符 命名变量规则: Came

lua学习笔记之函数

Lua学习笔记之函数 1.  函数的作用 函数主要完成指定的任务,这样的情况下函数作为调用语句使用,函数可以计算并返回值,这样的情况下函数作为赋值语句的表达式使用. 语法: funcationfunc_name(arguments-list) Statements-list end 调用函数的时候,如果参数列表为空,必须使用()表示是函数调用. Print(8*9,9/8) a = math.sin(3) +math.cos(10) print(os.date()) 上述规则有一个例外,当函数只

swift学习笔记2——函数、闭包

阅读目录 函数 闭包 之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询用.详细可以参考the-swift-programming-language-in-chinese,或者苹果官方英文版文档 当前版本是swift2.2 函数 func sayHello(personName: String, alreadyGreeted: Bool) -> S

iOS学习笔记06—Category和Extension

iOS学习笔记06—Category和Extension 一.概述 类别是一种为现有的类添加新方法的方式. 利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inheritance)更为简洁的方法来对class进行扩展,无需创建对象类的子类就能为现有的类添加新方法,可以为任何已经存在的class添加方法,包括那些没有源代码的类(如某些框架类). 二.示例 1.声明类别 @interface NSString (CategoryDemo) -(NSNumber*)