Spaß mit Strings: "Hallo".Equals("ollaH") == true ?! ;-)

Vielleicht hat das auch irgendwie aus irgendeinem Grund was mit Linux zu tun.
Bei Dir klappt es ja mit Mono unter Windows, richtig? Oder hast Du es nur kompiliert aber nicht gestartet?
Naja, ich hab eh keine Ahnung von C-Jaegerzaun. :D
 
Hallo!

Doch ich habs kompiliert... na ja, ist heute einfach zu heiß...
Edit: Ausführen konnte ichs bei mir unter Mono (1.1.x) auch.

Gruß Tom
 
Kompilieren konnt ich es auch, der oben gepostete Fehler kam lediglich bei der Ausfuehrung.
Hast Du das Programm denn auch gestartet oder nur kompiliert? Falls nur kompiliert koennte es ja sein, dass Du bei einem Start das gleiche Problem haettest. Waere auf jeden Fall noch interessant zu wissen.
 
Ich kapiere es auch nicht ...

Ich habe es mal für ne Stringeingabe umgeschrieben:

C#:
public class Test
          {
              public static void Main(string[] args)
              {
                  string input1 = Console.ReadLine();
                  string input2 = Console.ReadLine();
                  DoSomeMagic(input1);
                  Console.WriteLine(input1.Equals(input2));
//                  Console.WriteLine("Hallo".Equals("ollaH"));
                  Console.ReadLine();
              }
 
              #region magic...
              public static void DoSomeMagic(string input1)
              {
                  char[] chars = "Hallo".ToCharArray();
                  for (int i = 0; i < chars.Length; i++)
                  {
                      InvokeMethodOn(input1, "SetChar", new Type[] { typeof(Int32), typeof(Char) }, new object[] {i,chars[chars.Length -i -1]});
                  }
              }
       
              private const System.Reflection.BindingFlags ALL_INSTANCE_BOUND_METHODS = System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.InvokeMethod;
 
              public static object InvokeMethodOn(object instance, string methodName, Type[] signature, object[] args)
              {
                  System.Reflection.MethodInfo methodInfo = instance.GetType().GetMethod(methodName, ALL_INSTANCE_BOUND_METHODS, null, signature, null);
                  return methodInfo.Invoke(instance,args);
              }
              #endregion
          }


Mit "Hallo" und "ollaH" gehts,

aber z.B. mit "der" und "red" nicht.

Wieso ?

Grüße
Speedy
 
Mein Fehler es geht :

hab was vergessen

char[] chars = input1.ToCharArray();

Grüße
Speedy


P.S.:
Ich kapiere es trotzdem nicht ;(
 
Hallo!

Dieser Trick funktioniert deshalb weil in C# String literale mit dem gleichen Inhalt die in der Form von "........" im Code stehen intern immer auf die selbe String Referenz zeigen. Das heißt dass ein Referenzvergleich zwischen "ABC" == "ABC" true ergibt. Da ich nun in DoSomeMagic das interne char[] an der Referenz von "Hallo" manipuliere und an anderer Stelle auch wieder dieses String litaeral "Hallo" verwende greife ich dann auf die "geänderte" String Referenz zu.

Gruß Tom
 
Jo, danke

War grad mal bei nem Kollegen, der ist schon ein bisschen wacher wie ich, der konnte es mir auch erklären.
Schöne Sache.
Aber wie kommt man nur auf solche Schweinereien?
 
Hallo,

so funktioniert es unter Mono:
C#:
using System;
using System.Reflection;
namespace Training.Reflection.MagicStrings
{
	
	
	public class MainClass
	{
		public static void Main(string[] args)

        {

            DoSomeMagic();
            Console.WriteLine("Hallo".Equals("ollaH"));

        }

        #region magic...

        public static void DoSomeMagic()

        {

            char[] chars = "Hallo".ToCharArray();

            for (int i = 0; i < chars.Length; i++)

            {

                InvokeMethodOn("Hallo", "InternalSetChar", new Type[] { typeof(Int32), typeof(Char) }, new object[] {i,chars[chars.Length -i -1]});

            }

        }

 

        private const System.Reflection.BindingFlags ALL_INSTANCE_BOUND_METHODS = System.Reflection.BindingFlags.Instance  | System.Reflection.BindingFlags.NonPublic ;

        public static object InvokeMethodOn(object instance, string methodName, Type[] signature, object[] args)

        {

            System.Reflection.MethodInfo methodInfo = instance.GetType().GetMethod(methodName, ALL_INSTANCE_BOUND_METHODS);

            return methodInfo.Invoke(instance,args);

        }

        #endregion
	}
}


Gruß Konstantin
 
Zuletzt bearbeitet von einem Moderator:
Wow, danke fuer die spaete Ausfuehrung zu Mono, werd mich gleich mal ransetzen und es ausprobieren. :)

Nachtrag: Ja, ich kann bestaetigen, dass es geht.
 

Neue Beiträge

Zurück