Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
.NET 4.x

Return из метода, 3 варианта. Использовать int или byte?

26.05.2017, 23:57. Показов 2279. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
К примеру, нам нужно возвращать из метода 3 варианта, bool нам не подходит, так как больше 2-ух, стоит ли использовать byte вместо int для какой-либо пользы(оптимизация, экономия озу и т.д). Ибо byte 0-255, а int -2,147,483,648 - 2,147,483,647

C#
1
2
3
4
5
6
7
8
9
private int One()
{
// если что-то
return 0;
// если что-то
return 1;
// если что-то
return 2;
}
C#
1
2
3
4
5
6
7
8
9
private byte One()
{
// если что-то
return 0;
// если что-то
return 1;
// если что-то
return 2;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.05.2017, 23:57
Ответы с готовыми решениями:

Какой тип (int или byte) использовать для операций с большими массивами
Всем здравствуйте. Есть 2 массива. Массивы неизвестной, очень большой длинны. Я в циклах перемножаю эти массивы. Для сохранения результатов...

Что это isOk(int s),setAge(int g){if(isOk(g){age=g;return true;}else{.;return false;}}.getName(){return name;}?
package com.company; import java.io.Serializable; public class person implements Serializable { protected String name; ...

Варианты конвертации bool/byte/int в byte/int
В Си, если мне не изменяет память можно наоборот любые данные интерпретировать как true/false. А вот меня интересует преобразование...

11
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
27.05.2017, 00:12
Defences,
Перечисление подойдет?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
class Program
{
    enum MyEnum { First, Second, Third };
    static void Main(string[] args)
    {
        Console.WriteLine(GetVariant(3));
        Console.WriteLine(GetVariant(15));
        Console.WriteLine(GetVariant(30));
        Console.WriteLine((int)GetVariant(3));
        Console.WriteLine((int)GetVariant(15));
        Console.WriteLine((int)GetVariant(30));
    }
 
    static MyEnum GetVariant(int x)
    {
        if (x < 10) return MyEnum.First;
        if (x < 20) return MyEnum.Second;
        else return MyEnum.Third;
    }
}
1
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
27.05.2017, 00:20  [ТС]
Даценд, спасибо, все же есть разница между byte или int? enum это лишний код, ведь проще при написании метода сразу объявить возвращяемые данные.

P.s нужно возвращать из ментода Да/Нет/Не знаю, bool охватывает только два Да/Нет.
Значит будем использовать int
0 - Да
1 - Нет
2 - Не знаю

Меня интересует, а не лучше будет создавать не int ради 3 вариантов возврата 0,1,2 а short или вообще byte?
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
27.05.2017, 00:30
Nullable bool?
C#
1
2
3
4
5
6
7
8
9
bool? Func()
{
    // 1
    return true;
    // 2
    return false;
    // 3
    return null;
}
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
27.05.2017, 00:37
Цитата Сообщение от Defences Посмотреть сообщение
bool охватывает только два Да/Нет.
Есть nullable тип bool? (? - часть названия типа). Там три значения: true, false, null
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(GetVariant(3));
        Console.WriteLine(GetVariant(15));
        if (GetVariant(30)==null) Console.WriteLine("Не знаю!");
    }
 
    static bool? GetVariant(int x)
    {
        if (x < 10) return true;
        if (x < 20) return false;
        else return null;
    }
}
Цитата Сообщение от Defences Посмотреть сообщение
не лучше будет создавать не int ради 3 вариантов возврата 0,1,2 а short или вообще byte?
Лучше int.
1
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
27.05.2017, 00:41
Даценд, дико извиняюсь, но все ж таки, чем лучше то?
0
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
27.05.2017, 04:46  [ТС]
Даценд, мне тоже интересно, ибо если дело обстоит как и с переменными, то для создания

C#
1
2
3
private int Method()
{
}
Потратится больше ОЗУ и ресурсов, чем для
C#
1
2
3
private byte Method()
{
}
P.s спасибо за bool? с ним можно 3 варианта обрабатывать, а если 4 и более, то все же не понятно byte, short или int?
0
Эксперт .NET
 Аватар для Usaga
14136 / 9360 / 1350
Регистрация: 21.01.2016
Сообщений: 35,180
27.05.2017, 05:12
Цитата Сообщение от Defences Посмотреть сообщение
Потратится больше ОЗУ и ресурсов
Любите на спичках экономить? К тому же, ответ из метода ВСЕГДА вернётся в регистре процессора, а он 32\64 битный (зависит от архитектуры винды). Так что экономии ОЗУ (как и траты) - нуль.

Правильной практикой является использование перечислений (Enum), как и было выше посоветовано. "Лишенего кода" всего несколько строк, в замен же вы получаете повышенную читабельность кода и самодокументированность сигнатуры метода. Т.е. гляда на метод static MyEnum GetVariant(int x) вы уже точно можете сказать, что именно он вернёт, чего не скажешь про вариант static int GetVariant(int x). Если вы считаете, что это лишнее и вы будете помнить что может вернуть метод, то я вас расстрою: это "помнить" улетучивается очень быстро, а сторонний программист вообще не в курсе изначально.

К тому же, если вы любите экономить там, где это невозможно, то имейте в виду, что Enum - тип значащий (по умолчанию Int32) и его тип можно явно задавать:

C#
1
2
3
4
5
6
public enum SomeVariant : byte
{
     Yes,
     No,
     DoNotKnow
}
1
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
27.05.2017, 05:33  [ТС]
Usaga, а если таких методов много, где возвращается 3 или более и они похожи, можно ли сделать вспомогательный static class где будут хранится enum?

Определить состояний 10 и оттуда черпать для всех методов, где это требуется, какой-то метод возвращает только 4, другой 8 и т.д
0
Эксперт .NET
 Аватар для Usaga
14136 / 9360 / 1350
Регистрация: 21.01.2016
Сообщений: 35,180
27.05.2017, 06:24
Defences, зачем перечисления прятать в статичный класс? Пускай просто висят в пространстве имён и будут доступны всем. Или я не правильно понял ваш вопрос?
1
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
27.05.2017, 10:46
Лучший ответ Сообщение было отмечено Defences как решение

Решение

Цитата Сообщение от Defences Посмотреть сообщение
Определить состояний 10 и оттуда черпать для всех методов, где это требуется, какой-то метод возвращает только 4, другой 8 и т.д
Похоже, вы не понимаете зачем нужен enum. Давайте я объясню почему все вышеперечисленные варианты не годятся (кроме enum) и почему:

1) Самое главное это не синтаксис и не объем памяти. Главное - это семантика программы, ее смысл и понятность. ООП придумано не для машины, а для человека. Компьютер одинаково понимает и ассемблер и C# - ему все равно. А вот человеку - не все равно. Поэтому ваша программа в первую очередь должна быть понятной человеку.

2) Теперь посмотрим на варианты возврата byte и int (пока не будем трогать техническую сторону). Эти варианты не годятся потому что они не отражают семантику возвращаемого значения. Вы сами пишите:
Code
1
2
3
4
Значит будем использовать int
0 - Да
1 - Нет
2 - Не знаю
То есть вы возвращаете не просто числа, вы возвращаете коды которые имеют семантику. Но как внешняя программа поймет смысл этих кодов, если вы вернете int? Никак. Значит такой вариант не годится. Кроме того, эти числа могут принимать больше значений чем 3, соответственно возрастает вероятность неправильной интерпретации.

3) Далее, вариант bool? также плох. Да, он может принимать три значения, но смысл этих значений - совершенно другой. Здесь будет нецелевое использование значений. Этот вариант еще хуже чем int потому что у чисел нет особого значения, а у bool? - есть вполне конкретные значения - true, false и null. И они не совпадают с теми, которые нужны вам. То есть вы не просто не помогаете внешнему читателю кода, а еще и запутываете его.
Кроме того, здесь проблема еще и в том, что если вы в будущем захотите возвращать не три а более значений, то bool? станет точно непригодным для использования.

4) И наконец enum - это как раз тот механизм который вам нужен. Потому что он передает семантику:
C#
1
2
3
4
public enum Answer
{
  Yes, No, NoAnswer
}
По этому enum внешнему читателю сразу понятно, что возвращается ответ на какой-то вопрос и сразу понятно какие возможные варианты могут быть и что означает каждый из них.

Я так понимаю, вас смущает то, что для этого нужно создавать отдельный класс(enum), и что это лишняя работа? Это не так. Представьте себе ситуацию - вы разработали программу и уволились. А вместо вас пришел новый программист. Откуда программист узнает что означают все эти int, byte или bool? Ниоткуда. Вам придется ему писать тех документацию - типа "0 - Да, 1 - Нет, 2 - Не знаю". Но если это все равно придется писать, то не легче ли это сразу написать в коде - в виде enum? Ваш код должен быть понятен и очевиден сам по себе, должен быть самодокументированным. Что бы любой человек, взглянувший на него легко понял, что код делает, какие значения возвращает и т.д. Именно для этого и необходимо enum.

Теперь что касается технической стороны вопроса.
Как уже писали - при возврате значений по любому возвращается машинное слово (32 или 64 бита) независимо от типа (хоть int, хоть byte). Поэтому здесь нет экономии. Существенная разница между byte и int может быть только при хранении этих величин и в больших масштабах. То есть если бы у вас был массив на сотни миллионов значений, тогда было бы уместным думать о том, хранить это в byte или int - разница была бы в 4 раза. Но это не ваш случай.
Вариант с bool? еще хуже, потому что этот тип является ссылочным типом-оберткой, и он занимает в памяти не 1 байт и не 4 байта а намного больше (не менее 16 байт). Но опять же это было бы важно только при хранении больших объемов данных. Для простого возврата из метода это не имеет особого значения.

Поэтому вам нужно сделать enum, перечислить в нем варианты значений, четко передавая их смысл. Если вы эти значения собираетесь хранить в больших объемах - enum можно унаследовать от byte для экономии памяти.

Цитата Сообщение от Defences Посмотреть сообщение
Определить состояний 10 и оттуда черпать для всех методов, где это требуется, какой-то метод возвращает только 4, другой 8 и т.д
Важно не то, сколько значений в enum, важна семантика этих значений. Для каждого смыслового типа нужно создать отдельный enum. Даже если эти enum будут содержать одинаковое количество элементов. Например если в одном методе вам нужно вернуть согласен/не_согласен, а в другом да/нет, то нужно создавать два разных enum потому что семантика значений - разная.
6
310 / 318 / 119
Регистрация: 29.10.2011
Сообщений: 1,006
27.05.2017, 11:09
Defences, А что, если не секрет, вы пишете? что за методы? может вы изначально делаете не так.

Плевать на ООП, как предлагаете вы, нужно только тогда, когда в профилировщике вы нашли узкое место в плане производительности или памяти, которое нужно оптимизировать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.05.2017, 11:09
Помогаю со студенческими работами здесь

Преобразовать byte[] в float или int
Имеется массив типа byte, необходимое мне значение занимает 2 байта, нужно эти 2 байта переконвертировать либо в float либо int. Каким...

Что делает Read(byte[] buffer, int offset, int count) метод класса Stream
Что делает Read(byte buffer, int offset, int count) метод класса Stream. Приведите пример использования данного метода. Спасибо!

Byte to int или "самодельная кодировка"
Есть сервак, отправляющий строчки, содержащие русские буквы. while(is.available()==0) //ожидание ответа от сервера.. {} StringBuffer...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru