Что делает касательно, val и означает на параметрах метода?

Это было хорошим решением https://stackoverflow.com/a/11810957/185565 бедных. В одном из комментариев рассматривался счетчик для спасения в случае чрезвычайной ситуации. Это моя модификация.

function doTheMagic(counter) {
  alert("It worked on " + counter);
}

// wait for document ready then call handler function
var checkLoad = function(counter) {
  counter++;
  if (document.readyState != "complete" && counter<1000) {
    var fn = function() { checkLoad(counter); };
    setTimeout(fn,10);
  } else doTheMagic(counter);
};
checkLoad(0);

22
задан bjan 25 October 2012 в 07:41
поделиться

4 ответа

По умолчанию (в C#), передавание объекта к функции на самом деле передает копию ссылки на тот объект. Изменение самого параметра только изменяет значение в параметре, а не переменную, которая была определена.

void Test1(string param)
{
    param = "new value";
}

string s1 = "initial value";
Test1(s1);
// s1 == "initial value"

Используя out или ref передачи ссылка на переменную, определенную в вызове к функции. Любые изменения в значении out или ref параметр будут пасоваться назад вызывающей стороне.

И out и ref ведут себя тождественно за исключением незначительных различий: ref параметры требуются, чтобы быть инициализированными перед вызовом, в то время как out параметры могут быть неинициализированными. Следовательно, ref параметры, как гарантируют, будут инициализированы в начале метода, в то время как out параметры рассматривают как неинициализированные.

void Test2(ref string param)
{
    param = "new value";
}

void Test3(out string param)
{
    // Use of param here will not compile
    param = "another value";
}

string s2 = "initial value";
string s3;
Test2(ref s2);
// s2 == "new value"
// Test2(ref s3); // Passing ref s3 will not compile
Test3(out s2);
// s2 == "another value"
Test3(out s3);
// s3 == "another value"

Редактирование : Как [1 117] указывает разность потенциалов , различие между [1 112] и ref только осуществляется компилятором C#, не CLR. Насколько я знаю, VB не имеет никакого эквивалента для [1 114] и реализует ref (как [1 116]) только, соответствуя поддержке CLR.

27
ответ дан Community 29 November 2019 в 04:47
поделиться

Одно дополнительное примечание о касательно по сравнению с: различие между этими двумя осуществляется компилятором C#. CLR не различает между, и касательно Этого означает, что у Вас не может быть двух методов, подписи которых отличаются только или касательно

void foo(int value) {}

// Only one of the following would be allowed

// valid to overload with ref
void foo(ref int value) {}

// OR with out
void foo(out int value) {}
8
ответ дан denis phillips 29 November 2019 в 04:47
поделиться

out средства, что параметр будет инициализирован методом:

int result; //not initialised

if( int.TryParse( "123", out result ) )
   //result is now 123
else
   //if TryParse failed result has still be 
   // initialised to its default value (0)

ref вынудит базовую ссылку быть переданной:

void ChangeMyClass1( MyClass input ) {
   input.MyProperty = "changed by 1";
   input = null;
   //can't see input anymore ... 
   // I've only nulled my local scope's reference
}

void ChangeMyClass2( ref MyClass input ) {
   input.MyProperty = "changed by 2";
   input = null;
   //the passed reference is now null too.
}

MyClass tester = new MyClass { MyProperty = "initial value" };

ChangeMyClass1( tester );
// now tester.MyProperty is "changed by 1"

ChangeMyClass2( ref tester );
// now tester is null
3
ответ дан Keith 29 November 2019 в 04:47
поделиться

Один из моих собственных вопросов в stackoverflow обрабатывает эту тему также.
Это обрабатывает [приблизительно 110] "передачу ссылочной" и "передачей значением" в различных типах языков, , c# включен поэтому, возможно, можно найти некоторую дополнительную информацию там также.

В основном это сводится:

  • касательно: параметр с касательно ключевого слова будет передан ссылкой
  • : параметр с ключевое слово будут рассматривать как выходной параметр

, но это - действительно самый основной ответ, который можно дать, поскольку это немного более сложно, чем это указано здесь

2
ответ дан Community 29 November 2019 в 04:47
поделиться