Есть ли способ передать ссылку в метод без ключевого слова ref c Sharp - PullRequest
0 голосов
/ 20 апреля 2020

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

public static void ReadFile()
{
    for(int i=0; i<5; i++)
    {
        if(this)
        {
            SetStatus(Program.systemAbortedHamiltons[i], i);
        }
        if(this)
        {
            SetStatus(Program.runningHamiltons[i], i);
        }
    }
}

public static void SetStatus(ref bool status, int i)
{
    Console.WriteLine("SetStatus");
    Program.systemAbortedHamiltons[i] = false;
    Program.runningHamiltons[i] = false;
    Program.userAbortedHamiltons[i] = false;
    Program.methodEndHamiltons[i] = false;
    status = true;
}

Надеюсь, что это имеет смысл, любые предложения будут высоко оценены.

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

Что вы можете сделать, так это передать сам список следующим образом: (при условии, что они List<bool>, а если нет, просто замените его на фактический тип коллекции)

public static void ReadFile()
{
    if(/* condition 1 */)
    {
        SetStatus(Program.systemAbortedHamiltons, i);
    }
    if(/* condition 2 */)
    {
        SetStatus(Program.runningHamiltons, i);
    }
}

public static void SetStatus(List<bool> statuses, int i)
{
    Console.WriteLine("SetStatus");
    Program.systemAbortedHamiltons[i] = false;
    Program.runningHamiltons[i] = false;
    Program.userAbortedHamiltons[i] = false;
    Program.methodEndHamiltons[i] = false;
    statuses[i] = true;
}

Ниже приведен быстрый тест, чтобы увидеть если он работает:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<bool> myList = new List<bool>
        {
            true, true, true
        };

        // Outputs "True"
        Console.WriteLine(myList[0]);

        SetFalse(myList, 0);

        // Outputs "False"
        Console.WriteLine(myList[0]);
    }

    static void SetFalse(List<bool> l, int i)
    {
        l[i] = false;
    }
}

Выходы:

True
False

0 голосов
/ 20 апреля 2020

Классы в c# равны Reference type, и вы можете создать такой класс

public class CheckStatus
{
    public bool Status { get; set; }
}

, а затем передать экземпляр класса методу как это

public static void SetStatus(CheckStatus status,int i)
{
    Console.WriteLine("SetStatus");
    Program.systemAbortedHamiltons[i] = false;
    Program.runningHamiltons[i] = false;
    Program.userAbortedHamiltons[i] = false;
    Program.methodEndHamiltons[i] = false;
    status.Status = true;
}

и

public static void ReadFile()
{
    CheckStatus status = new CheckStatus();
    if(this)
    {
        status.Status = Program.systemAbortedHamiltons[i];
        SetStatus(status, i);
        Program.systemAbortedHamiltons[i] = status.Status;
    }
    if(this)
    {
        status.Status = Program.runningHamiltons[i];
        SetStatus(status, i);
        Program.runningHamiltons[i] = status.Status;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...