Область применения в C #, что происходит при вызове функции? Потеря объема? - PullRequest
1 голос
/ 20 октября 2010

У меня есть объект, а именно «сервер», который теряет свое существование, когда управление программой выходит из области видимости.

Так что в общем случае для любых таких объектов и памяти объектов, когда вызывается функцияиз области видимости объект потерян?

как

void main void
{
     if this and that
     { //scope
         do this
         call_func();
     }
 }//main ends


void call_func()
{
    working
    "utilise objects created in parent."
    return;
}

call_func не сможет увидеть, что создано родительской функцией?да ?или нет?

Ответы [ 2 ]

1 голос
/ 20 октября 2010

call_func не сможет увидеть, что создано родительской функцией? да ? или нет?

Представьте себе этот сценарий:

void ParentMethod1()
{
 object something1;
 call_func();
}

void ParentMethod2()
{
 object somethingdifferent1;
 call_func();
}

void call_func()
{
  object scopeObject;
}

Какие объекты, по вашему мнению, должны быть доступны для call_func?

Что если call_func общедоступен и вызывается из совершенно другой сборки?

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

1 голос
/ 20 октября 2010

Как правило, область действия заключена в фигурные скобки.Поэтому все в call_func имеет свою собственную область видимости, полностью отделенную от родительской функции.

Когда управление возвращается к родительской функции, объекты, которые находились в области видимости до вызова функции, все еще находятся в области видимости всего, что находится в скобках.

Дочерний метод имеет доступ только к объектам, которые находятся в родительском class .Объекты, определенные в родительском методе , доступны только в том случае, если они специально переданы (в качестве параметров) дочернему элементу.

class testClass
{
    private int classLevelInt;

    private void Main()
    {
        int methodLevelInt;

        if (someTest)
        {
             int bracketLevelInt;

             // classLevelInt, methodLevelInt and bracketLevelInt all in scope
             ChildMethod();
             // classLevelInt, methodLevelInt and bracketLevelInt all in scope
        }

        // only classLevelInt and methodLevelInt are still in scope
    }

    private void ChildMethod()
    {
        // This method can see classLevelInt only
        // If access to other ints is required they must be passed to the method
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...