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
a.angelov avatar a.angelov 1316 Точки

Първи вариант: Можеш да изнесеш isSequence в рамките на класа като static променлива и ще бъде достъпна от всички методи в класа.

class FiveSpecialLetters
{
      static bool isSequence = false;

      static void Main()
      {

 

Друг вариант:

В мейн метода декларирай булевата ти променлива да приема стойност /true или false/ получена от метода PringSequence, в който правиш проверката: например bool sequenceFound = PringSequence(...);

Направи PringSequence метода да връща булева стойност: static bool PringSequence и съответно:

return isSequence /isSequence я декларирай в началото на метода/.

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