Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
 Аватар для RaevskiAnatoly
34 / 35 / 12
Регистрация: 04.03.2017
Сообщений: 444

Какое зло из двух меньшее?

28.03.2018, 19:21. Показов 1506. Ответов 6

Студворк — интернет-сервис помощи студентам
Меня всегда раздражал практически идентичный код в некоторых местах кода. Но порой проще смирится с этим, ведь решение обойдется дороже , возможно, в плане производительности, и количестве работы. Такая вот дрянь и в паттерне MVVM. Если есть любая не OneTime или OneWayToSource привязка, то должен быть реализован интерфейс INotify... даже и писать полное имя не хочется. В каждом прибиндиваемом свойстве обязательно будет однотипный код, вроде проверки не было ли это значение, что и до, обязательный вызов события с поверкой на null, в лучше случае для этой однотипной работы будет создан абстрактный класс с объявленными событиями и методом OnPropertyChanged.
Решить эту проблему трудно. Можно сделать с помощью рефлексии, но медленно, да и прописывать все время в придачу к свойству nameof тоже утомляет. Можно последовать способу обертывания, что я и решил попробовать сделать.
Обертка :
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    public abstract class TypeShell : PropertyChangedNotifer, INotifyPropertyChanging
    {
        public event PropertyChangingEventHandler PropertyChanging;
        protected object IncapsulatePropertyValue;
 
        protected TypeShell(object incapsulatePropertyValue) => IncapsulatePropertyValue = incapsulatePropertyValue;
 
        protected void OnPropertyChanging(string propertyName)
            => PropertyChanging?.Invoke(this, new PropertyChangingEventArgs(propertyName));
    }
 
    public class TypeShell<T> : TypeShell
    {
        public T Value
        {
            get => (T) IncapsulatePropertyValue;
            set
            {
                if (Equals(value, IncapsulatePropertyValue))
                    return;
                OnPropertyChanging(nameof(Value));
                IncapsulatePropertyValue =  value;
                OnPropertyChanged(nameof(Value));
            }
        }
 
        private TypeShell(T value) : base(value)
        {
            
        }
 
 
        public static implicit operator TypeShell<T>(T value) => new TypeShell<T>(value);
        public static implicit operator T(TypeShell<T> value) => (T) value.IncapsulatePropertyValue;
    }
Допустим, примитивная viewmodel:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
    public class SmartViewModel
    {
        public TypeShell<string> Name { get; } = "My name is fiddooor";
 
        public SmartViewModel()
        {
            Task.Factory.StartNew(() =>
            {
                Thread.Sleep(3000);
                Name.Value = "!";
            });
        }
    }
Но все равно нужно будет все время писать Property.Value!!! Хоть застрелись опять повторяющийся код.
Можно еще написать расширение разметки, чтобы в xaml не писать все время.Value
Вот и как это разрешить, и что лучше
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.03.2018, 19:21
Ответы с готовыми решениями:

Какое самое меньшее напряжение нужно приложить к конденсатору, чтобы электроны не вылетели из него?
Электрон, получивший свою скорость под действием напряжения 6000 В, влетает в середину между пластинами плоского конденсатора параллельно...

Какое самое меньшее напряжение нужно приложить к конденсатору, чтобы электроны не вылетели из него?
Поток электронов, получивший свою скорость под действием напряжения 4000 В, влетает в середину между пластинами плоского конденсатора...

Найти меньшее из двух значений
В С++ шарю поверхностно. Недавно разобралась только с простенькими массивами, а тут уже задали такое и я банально не понимаю. Даны...

6
90 / 90 / 48
Регистрация: 07.12.2011
Сообщений: 215
28.03.2018, 19:43
Цитата Сообщение от RaevskiAnatoly Посмотреть сообщение
нужно будет все время писать Property.Value!!!
Ну это как бы ок.

Но если прям не в моготу, то можно попробовать что-то типа:

C#
1
2
3
4
5
6
7
8
private TypeShell<string> _name { get; } = "My name is fiddooor";
 
public string Name { 
  get 
  {
     return _name.Value;
  }
}
1
Эксперт .NET
 Аватар для Usaga
14078 / 9295 / 1347
Регистрация: 21.01.2016
Сообщений: 34,895
29.03.2018, 05:48
Лучший ответ Сообщение было отмечено RaevskiAnatoly как решение

Решение

RaevskiAnatoly, так как вы никто не делает. Обычно наследуют всю View Model от астрактного класса, а не отдельные свойства заворачивают.

Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    public abstract class NotifyPropertyChangedViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
 
        protected virtual void NotifyPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
 
        protected void SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
        {
            if (!EqualityComparer<T>.Default.Equals(field, value))
            {
                field = value;
                NotifyPropertyChanged(propertyName);
            }
        }
    }


А потом просто вызывают метод базового класса:
C#
1
2
3
4
5
6
7
8
9
    public class SmartViewModel : NotifyPropertyChangedViewModel
    {
        private string _name;
        public string Name  
        {
             get { return _name; }
             set { SetField(ref _name, value) }
        }
    }
Дешёво и сердито.

Есть другой вариант: использовать библиотечку PropertyChanged.Fody, которая пропатчит ваше приложение сразу после сборки и сама вставит аналог SetField в каждый сеттер.
2
 Аватар для RaevskiAnatoly
34 / 35 / 12
Регистрация: 04.03.2017
Сообщений: 444
29.03.2018, 11:53  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
SetField(ref _name, value)
А почему не передается имя свойства?
0
Эксперт .NET
 Аватар для Usaga
14078 / 9295 / 1347
Регистрация: 21.01.2016
Сообщений: 34,895
29.03.2018, 11:54
RaevskiAnatoly, потому, что оно определяется самим компилятором:

C#
1
protected void SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
1
29.03.2018, 12:02  [ТС]

Не по теме:

А еще думал, что все-таки дают эти атрибуты, что мне студия втирает)

0
139 / 139 / 53
Регистрация: 14.06.2016
Сообщений: 467
29.03.2018, 15:23
еще дешевле - снипеты зачем по вашему придумали ?
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?xml version="1.0" encoding="utf-8" ?> 
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> 
    <CodeSnippet Format="1.0.0"> 
        <Header> 
            <Title>Property With Change Event</Title> 
            <Shortcut>propn</Shortcut> 
            <Description>Code snippet for property that calls RaisePropertyChanged and XML description</Description> 
            <Author>PLaker</Author> 
            <SnippetTypes> 
                <SnippetType>Expansion</SnippetType> 
            </SnippetTypes> 
        </Header> 
        <Snippet> 
            <Declarations> 
                <Literal> 
                    <ID>type</ID> 
                    <ToolTip>Property type</ToolTip> 
                    <Default>string</Default> 
                </Literal> 
                <Literal> 
                    <ID>property</ID> 
                    <ToolTip>Property name</ToolTip> 
                    <Default>MyProperty</Default> 
                </Literal> 
            </Declarations> 
            <Code Language="csharp">
          <![CDATA[#region $type$ $property$
          private $type$ _$property$; 
            public $type$ $property$ { 
                get 
        { 
            return _$property$; 
        } 
                set 
        { 
            if (_$property$ != value)
            {
                _$property$ = value; 
                NotifyPropertyChanged(nameof($property$)); 
            }
        }
            } 
            #endregion$end$]]></Code> 
        </Snippet> 
    </CodeSnippet> 
</CodeSnippets>
Миниатюры
Какое зло из двух меньшее?  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.03.2018, 15:23
Помогаю со студенческими работами здесь

Из двух данных чисел A и B найти меньшее
контрольный пример : данные: результат: А=20, В=30 М=20 А=20, В=10 М=10 заранее...

Меньшее из двух чисел заменить их полусуммой
даны действительные числа х,у (х?у).Меньшее из этих двух чисел заменить их полусуммой, а большее их удвоинным произведением.

Меньшее из двух чисел заменить их полусуммой
Даны действительные числа х, у (х не равно у). Меньшее из этих двух чисел заменить их полусуммой, а большее – их удвоенным произведением. ...

Вывести меньшее из двух целых чисел
Даны два целых числа. Вывести меньшее из них.

Найти меньшее число из двух введенных
Здравствуйте. Новичок в С++.Азы. Задача: - написать программу, которая выводила бы диапазон чисел, обрабатывая ввод, так, чтобы первым...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru