Loading...
Hristo_Penchev avatar Hristo_Penchev 389 Точки

[Technical Issue] C# Basics - Как във void метод да променим променлива, записана в мейн

И още един въпрос за методи. Решавам задача Five Special Letters и създадох метод, който да проверява дали теглото е в искания от нас диапазон и ако да, да принтира редицата. Само че искам да го накарам и да записва някъде, че съществува такава редица. В някоя булева стойност например. За да може след края на програмата, ако няма никакви редици, да ми изпише, no. Ето метода:

 static void PringSequence(int weight, int start, int end, List<int>weights, char[] symbols)
    {
        if ((weight >= start) && (weight <= end))
        {
            foreach (int number in weights) Console.Write(symbols[number]);
            Console.WriteLine();
            isSequence = true;
        }
    }

isSequence не ми я разпознава, понеже е записана в мейн метода.

Как да накарам програмата, освен да ми изпринти редицата, да запомни, че това се е случило?

Тагове:
0
Programming Basics
ZvetanIG avatar ZvetanIG 907 Точки

Опитай това

static void PringSequence(int weight, int start, int end, List<int>weights, char[] symbols, ref isSequence )
    {
        if ((weight >= start) && (weight <= end))
        {
            foreach (int number in weights) Console.Write(symbols[number]);
            Console.WriteLine();
            isSequence = true;
        }
    }

В  случая магията става с ключовата дума ref.

Може да прочетеш повече ето тук http://msdn.microsoft.com/en-us/library/14akc2c7.aspx

1
Filkolev avatar Filkolev 4482 Точки

Много полезна информация, благодаря! Попаднах наскоро в случай да искам един метод да ми върне две неща, нещо като казусът, който споделя колегата. Но при мен методът ми връщаше число (или булева стойност, не помня), а исках да върне и още нещо, ако не се лъжа исках да ми увеличи един брояч, който си бях дефинирал в Main. Тогава намерих начин да заобиколя проблема и не се разтърсих как мога да подходя. Определено ще проуча как се ползва ref.

0
RoYaL avatar RoYaL Trainer 6849 Точки

В добрия дизайн на кода, има голям шанс, да не ви се налага често да използвате REF. Подаването по референция според мен трябва да се използва в краен случай. Ако нещо трябва да се променя в скоупа на програмата, нека се променя в скоупа на класа, а не на мейн метода. Може да дефинирате пропъртита, дори и статични (не е нужно да сте наясно с парадигмата на обектно ориентираното програмиране за това) и да ги променяте от кой да е метод в класа, стига те да не са файнъл.

 

class Test

{

    static int localVar = 100;

 

    static void Main()

    {

         changeLocalVarByValue(250);

         Console.WriteLine(localVar); // 350

    }

 

    static void ChangeLocalVarByValue(int val)

    {

         localVar += val;

    }

 

P.S.: Такова нещо като метод да върне две неща не трябва да има. Ако метод ходи до магазина, чисти къщата и пее в дискотека, то chances are - нещо фундаментално в дизайна на кода е сбъркано, и single responsibility principle-а е нарушен. Един метод, ако идеята му е да върне някаква стойност, то ако тази стойност се нуждае от калкулации, те трябва да са локални. Метод, който променя в глобал скоупа стойност и същевременно връща стойност, е първи признак за лош дизайн на кода.

3
ZvetanIG avatar ZvetanIG 907 Точки

Напълно си прав колега, но според мен човек трябва да знае как работят ref и out. А това как ще се ползват е друг въпрос.

0
RoYaL avatar RoYaL Trainer 6849 Точки

Така е, но трябва в момента, в който се запознават с тези неща, да са наясно, че не трябва да ги ползват като Holy grahl :) и че почти винаги решението е друго, и ако много често им се налага да ги ползват, значи са объркали нещо и е време вместо да продължават да ползват ref, да помислят за оправяне на кода. Има някакви такива специфики във всеки език, които почти никога не са решението на проблема. Както, например, eval() в РНР. Там дори създателите казват "If the answers of your question is eval(), you are most probably asking the wrong question" :) Хубаво е да знаеш как работи и как може понякога да си решиш проблема с това, но просто съм забелязал как хората, пишейки crappy code, забелязват че им се улеснява работата като ползват eval() и &ref, и започва да им става навик, защото на база лошия код, го намират за улеснение. :-) Просто не е друг въпрос, а е част от въпроса/проблема. Да знаеш в кои ситуации е приемливо да използваш даден начин за решаване на проблем, и в кои - не. Мога да дам пример и със singleton design pattern-а. Решава проблеми, но е considered anti-pattern, ако се ползва за неща, които могат да бъдат решени и по друг начин.

1
ZvetanIG avatar ZvetanIG 907 Точки

smile

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.