你在语义上是对的,ref
同时提供“in”和“out”功能,而out
只提供“Out”功能。有一些事情需要考虑:
out
要求接受参数的方法必须在返回之前的某个时候为变量赋值。您可以在一些键/值数据存储类中找到这种模式,如Dictionary<K,V>
,您的功能如下TryGetValue
..此函数接受一个out
参数,该参数保存如果检索到的值。调用者传递一个值是没有意义的进
这个函数,所以out
用于保证调用后变量中的某些值,即使它不是“真实”数据(在TryGetValue
钥匙不在的地方)。out
和ref
参数在处理互操作代码时被不同地封送。
另外,重要的是要注意,虽然引用类型和值类型在其价值的性质上有所不同,应用程序中的每个变量都指向持有值的内存位置。,甚至对于参考类型也是如此。只是碰巧,对于引用类型,内存位置中包含的值是另一个内存位置。当将值传递给函数(或执行任何其他变量赋值)时,该变量的值将复制到另一个变量中。对于值类型,这意味着复制类型的整个内容。对于引用类型,这意味着复制了内存位置。无论哪种方式,它都会创建包含在变量中的数据的副本。这所拥有的唯一真正相关性是处理赋值语义;当分配变量或通过值传递(默认值)时,当一个新赋值被分配给原始(或新)变量时,它不会影响其他变量。在引用类型的情况下,是的,对实例都是可用的,但这是因为实际的变量只是另一个内存位置的指针;变量的内容-内存位置-实际上并没有改变。
带着ref
关键字表示两个原始变量和函数参数实际上指向相同的内存位置。这同样只影响赋值语义。如果将一个新值分配给其中一个变量,则由于其他值指向相同的内存位置,新值将反映在另一侧。