2016-02-29 6 views
0

Требования:Какой параметр изменить ключевое слово я должен использовать?

  1. переменной не нужно быть назначен при переходе его в функцию. (в отличие от ref)
  2. В функции не обязательно назначаться переменная. (в отличие от)

В настоящее время я буду называть ключевое слово mykw в коде ниже.

public class MyObj{ 
    int myInt; 
    public void setMyInt(int val){ 
     myInt = val; 
    } 
} 
public class MyObjContainer{ 
    private MyObj myObj; 
    //this function is the only way the user is allowed to get myObj. 
    //it returns whether myObj isn't null 
    //this is to disencourage programmers from using myObj without checking if myObj is null 
    public bool tryGetMyObj(mykw MyObj tryget){ 
     if(myObj != null){ 
      tryget= myObj; 
      return true; 
     } 
     //Micro optimization here: no needless processing time used to assign a value to tryget 
     return false; 
    } 
} 
public class MyScript { 
    public MyObjContainer[] myObjContainerList; 
    public void foo(){ 
     foreach(MyObjContainer myObjContainer in myObjContainerList){ 
      MyObj tryget; //Micro optimization here: no needless processing time used to assign a value to tryget 
      if(myObjContainer.tryGetMyObj(mykw tryget)){ 
       tryget.setMyInt(0); 
      } 
      //else ignore 
      //if uses tries accessing tryget.myInt here, I expect C# compiler to be smart enough to find out that tryget isn't assigned and give a compile error 
     } 
    } 
} 

Для кода, приведенного выше, использование или ссылка вместо mykw дает мне ошибку.

ответ

0

Если вы используете ref, то вам необходимо инициализировать параметр в вызывающем:

public bool tryGetMyObj(ref MyObj tryget) { ... } 

MyObj tryget = null; 
if(myObjContainer.tryGetMyObj(ref tryget) { ... } 

Если вы используете out то вызываемый должен инициализировать значение в каждом пути:

public bool tryGetMyObj(out MyObj tryget) { 
    if(myObj != null){ 
     tryget= myObj; 
     return true; 
    } 
    tryget = null; 
    return false; 
} 

MyObj tryget; 
if(myObjContainer.tryGetMyObj(out tryget)){ ... } 
+0

Я хочу ключевое слово, которое соответствует как требованию 1, так и требованию 2. Я объяснил причины в комментариях в приведенном ниже фрагменте кода. –

+0

@RyanAWE - такой модификатор не существует, поэтому вам нужно использовать 'ref' или' out', как показано. Я не был бы уверен, что они будут медленнее, чем подход, который вы ищете в любом случае. – Lee

+0

Есть ли способ создать параметр-модификатор, который функционирует как mykw, чтобы я мог его использовать? –