Passerer og lagring av pekere til uforanderlige typer og strykere i C #

stemmer
1

Er det en måte å lagre en peker til uforanderlige typer som strenger i C #? Hvordan kan utføre: Instance1.SomeFunction (ut myString);

Og lagre en peker til myString innsiden av Instance1?

Publisert på 19/02/2009 klokken 20:01
kilden bruker
På andre språk...                            


4 svar

stemmer
0

Jeg har kjempet med pekere i C # for en stund nå, og ble overrasket av mangel på alternativer. Du møter alle slags obskure hindringer når du arbeider med pekere og pekeren argumenter i C #:

  • Du kan ikke lage native pekere til administrerte typer, ikke engang til strenger
  • du kan ikke lagre uforanderlige ut / ref-argumenter for senere bruk
  • du kan ikke ha valg / kan ha nullverdier ut / ref-argumenter, selv om "null" er standardtilstanden for streng type
  • Du kan ikke bruke besvimte / ref-argumenter inne lambda-uttrykk

Ganske ryddig løsning jeg fant nylig, og også grunnen til dette innlegget er:

void Test()
{
  string ret = "";
  SomeFunction(a=>ret=a);
}

void SomeFunction(string_ptr str)
{
   str("setting string value");
}

delegate void string_ptr(string a);
Svarte 19/02/2009 kl. 20:04
kilden bruker

stemmer
0

Bruk denne klassen som en peker (merk: utestet notepad kode, trenger noen å fikse):

public class Box<T> {
    public Box(T value) { this.Value = value; }

    public T Value { get; set; }

    public static implicit operator T(Box<T> box) {
        return box.Value;
    }
}

For eksempel,

public void Test() {
    Box<int> number = new Box<int>(10);
    Box<string> text = new Box<string>("PRINT \"Hello, world!\"");

    Console.Write(number);
    Console.Write("    ");
    Console.WriteLine(text);

    F1(number, text);

    Console.Write(number);
    Console.Write("    ");
    Console.WriteLine(text);
    Console.ReadKey();
}

void F1(Box<int> number, Box<string> text) {
    number.Value = 10;
    text.Value = "GOTO 10";
}

skulle utgang

10    PRINT "Hello, world!"
20    GOTO 10
Svarte 19/02/2009 kl. 22:30
kilden bruker

stemmer
0

I forhold til svaret fra asker, er det galt med:

class Program
{
    static void Main()
    {
        string str = "asdf";
        MakeNull(ref str);
        System.Diagnostics.Debug.Assert(str == null);
    }

    static void MakeNull(ref string s)
    {
        s = null;
    }

}
Svarte 19/02/2009 kl. 23:00
kilden bruker

stemmer
0

Ok, jeg fant en annen delvis løsning på problemet mitt. Du kan bruke overbelastning, hvis du ønsker noen ref / ut-argumenter for å ha nullverdier:

void Test()
{
    string ret1 = "", ret2 = "";
    SomeFunction(ref ret1, ref ret2);
    SomeFunction(null, ref ret2);
    SomeFunction(ref ret1, null);
    SomeFunction(null,null);
}

string null_string = "null";

void SomeFunction(ref string ret1,ref string ret2)
{
   if( ret1!=null_string )
       ret1 = "ret 1";
   if( ret2!=null_string )
       ret2 = "ret 2";
}

// Additional overloads, to support null ref arguments
void SomeFunction(string ret1,ref string ret2)
{
    Debug.Assert(ret1==null);
    SomeFunction(null_string,ret2);
}
void SomeFunction(ref string ret1,string ret2)
{
    Debug.Assert(ret2==null);
    SomeFunction(ret1,null_string);
}
void SomeFunction(string ret1,string ret2)
{
    Debug.Assert(ret1==null&&ret2==null);
    SomeFunction(null_string,null_string);
}
Svarte 28/02/2009 kl. 10:31
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more