Как передать ссылку в и из класса - PullRequest
0 голосов
/ 07 июля 2010

Я хотел бы передать ссылку на переменную в класс, использовать ее, а затем получить ее позже.

Примерно так:

// Create the comment Screen
string newCommentText = "";
commentsScreen = new CommentEntry(this, ref newCommentText);

commentScreen.ShowDialog();

...

_dataLayer.SaveOffComment(newCommentText);

И затем в комментарииclass:

public partial class CommentEntry : Form
{
    public CommentEntry(Control pControl, ref string commentResult)
    {
        InitializeComponent();
        control = pControl;

        // ***** Need a way for this to store the reference not the value. *****
        _commentResult = commentResult;  
    }


    private string _commentResult;

    private void CommentEntry_Closing(object sender, CancelEventArgs e)
    {
        _commentResult = tbCommentText.Text.Trim();
    }
}

Есть ли каким-то образом, что newCommentText может иметь значение, установленное в _commentResult в методе закрытия?

ПРИМЕЧАНИЕ. Очевидно, что было бы просто установить переменную в моемкласс и доступ к нему после ShowDialog.Этот пример является лишь приближением моей реальной проблемы, и доступ к любым переменным в классе после выполнения ShowDialog невозможен.

Ответы [ 5 ]

3 голосов
/ 07 июля 2010

Это никогда не будет работать со строкой, так как они неизменны, и переменная изменится, чтобы указать на новый экземпляр.

У вас есть два основных варианта.Во-первых, просто нужно получить геттер для результата, чтобы к нему можно было обратиться, когда он понадобится позже.Другой вариант - передать владельцу метод делегата, который может быть вызван с передачей полученного значения.Владелец получит значение при закрытии CommentEntry.

2 голосов
/ 07 июля 2010

Как указал Дэн Брайант, вы не можете сделать это напрямую. Один из вариантов - заключить ссылку в класс, но это требует написания большого количества стандартного кода. Более простой вариант - использовать функции делегата и лямбды (в C # 3.0) или анонимные делегаты (C # 2.0):

string newCommentText = ""; 
// Using lambda that sets the value of (captured) variable
commentsScreen = new CommentEntry(this, newValue => {
  newCommentText = newValue });  
commentScreen.ShowDialog(); 
_dataLayer.SaveOffComment(newCommentText); 

Модифицированная версия формы CommentEntry будет выглядеть так:

public partial class CommentEntry : Form { 
  public CommentEntry(Control pControl, Action<string> reportResult) { 
    InitializeComponent(); 
    control = pControl; 
    // Store the delegate in a local field (no problem here)
    _reportResult = reportResult;    
  } 

  private Action<string> _reportResult; 

  private void CommentEntry_Closing(object sender, CancelEventArgs e) { 
    // Invoke the delegate to notify the caller about the value
    _reportResult(tbCommentText.Text.Trim()); 
  } 
} 
2 голосов
/ 07 июля 2010

Как правило, вы не можете напрямую сохранить «ссылку на ссылку» в C #, но вы можете сделать что-то вроде этого:

public interface ICommented
{
    string Comment { get; set; }
}

public class MyClass : ICommented
{
    public string Comment { get; set; }
}

public partial class CommentEntry : Form
{
    public CommentEntry(Control pControl, ICommented commented)
    {
        InitializeComponent();
        control = pControl;

        // ***** Need a way for this to store the reference not the value. *****
        _commented = commented;
    }


    private ICommented _commented;

    private void CommentEntry_Closing(object sender, CancelEventArgs e)
    {
        _commented.Comment = tbCommentText.Text.Trim();
    }
}

Так что теперь ваша форма может редактировать комментарий любого класса, который имеетсказал, что знает, как прокомментировать.

0 голосов
/ 07 июля 2010
0 голосов
/ 07 июля 2010

Создать свойство newComment класса CommentEntry.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...