ali khanna Ответов: 3

Как я могу сохранить предыдущие значения для свойства В C#


Я хочу сохранить старые значения (скорее, я могу сказать исходное значение) и измененное значение переменной в одном и том же свойстве. тип свойства может быть int/string/decimal.

например:
классный тест{

public int salary{get;set;}
public string month{get;set;}
}

когда я использую это
испытания Т = новый тест();
//инициализация
т. зарплата=10;
т. месяц="апрель";
//модифицирующий
т. зарплата=15;
т. месяц="Мар";

если я сделаю т. зарплату, то это, очевидно, даст мне последнее измененное значение, то есть 15, но я хочу также 10, чтобы это помогло мне в дальнейшем показать разницу.. последнее значение и новое значение.

есть ли какой-либо способ с помощью атрибутов c# или любого шаблона проектирования сохранить исходное значение и новое значение?

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

Что я уже пробовал:

Я думал, что могу сделать это с помощью атрибутов c#, но не знаю, как это сделать.

[no name]

Есть еще одно свойство для поддержания прежнего значения

3 Ответов

Рейтинг:
2

BillWoodruff

Во-первых, взгляните на эти статьи CodeProject::

Автоматизированная библиотека отмены/повтора, основанная на дженериках C# в .NET [^]

Реализация возможностей отмены и повтора объектов в .NET [^]

Имейте в виду, что то, что показано здесь ... какая буквальная интерпретация вашего вопроса предполагает ... это стек, коллекция last-in-first-out, с глубиной #1. Если ваша цель состоит в том, чтобы иметь более одного сохраненного состояния, рассмотрите возможность использования структуры данных стека .NET.

Использование типа ValueTuple C# 7 [^] , мы можем сделать это легко:

private (int Nmber, string Strg) _previousData;

public (int Nmber, string Strg) PreviousData // read-only
{
    get { return _previousData; }
}

private (int Nmber, string Strg) _currentData;

public (int Nmber, string Strg) CurrentData
{
    set
    {
        _previousData = (_currentData.Nmber, _currentData.Strg);
        _currentData = value;
    }
    get { return _currentData; }
}


// test: put in some method or EventHandler
// single-step through the code and observe the values

CurrentData = (100, "x");
CurrentData = (200, "y");

var previous = PreviousData;

int prevNum = previous.Nmber;
string prevStrg = previous.Strg;


Maciej Los

Хороший и полный ответ.
5ed!

Рейтинг:
2

F-ES Sitecore

class test{
private int _previousSalary;
private int _salary;

public int salary
{
    get { return _salary; }
    set 
    {
        _previousSalary = _salary;
        _salary = value;
    }
}


Повторите ту же мысль с месяцем.


BillWoodruff

при этом Предыдущее значение никогда не будет видно потребителям данного класса

F-ES Sitecore

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

BillWoodruff

"Дайте человеку рыбу и все такое". дайте человеку небрежный рисунок рыбы, а затем ...

Рейтинг:
2

Prifti Constantine

public  class test
{
  public int salary{get;set;}
  public string month{get;set;}
}
public class Execute()
{
  //Instantiating test object
  test t  = new test();
  //Creating a list of tests 
  //so we can store the previous values
  List<test> ListOfTests = new List<test>();
//initializing
 t.salary=10;
 t.month="apr";
 ListOfTests.Add(t);
//modifying
 t.salary=15;
 t.month="mar";
 ListOfTests.Add(t);
}
//the previous values now are stored inside the List of tests


BillWoodruff

этот код не сохранит первые значения, присвоенные "зарплате" и "месяцу"! вы изменяете только один экземпляр 'test, добавляя его дважды в список. вернитесь назад и изучите, что такое "ссылочный тип".