C# представляют ссылочный тип в виде строки?

Это фактическая деталь реализации CollapsingToolbarLayout, как показано в исходном коде :

if (Math.abs(verticalOffset) == scrollRange) {
  // If we have some pinned children, and we're offset to only show those views,
  // we want to be elevate
  ViewCompat.setElevation(layout, layout.getTargetElevation());
} else {
  // Otherwise, we're inline with the content
  ViewCompat.setElevation(layout, 0f);
}

Который удаляет высоту, когда CollapsingToolbarLayout показывает, -pinned elements - по умолчанию он будет иметь только высоту, когда видны только закрепленные дети.

156
задан 8 July 2009 в 06:44
поделиться

4 ответа

Я думаю, что существует 3 опции для передачи строки

#1, Если Вы используете касательно затем, необходимо указать функцию для передачи этого объекта

 class Test
    {
        public static void Main()
        {
            string test = "before passing";
            Console.WriteLine(test);
            TestI(ref test);
            Console.WriteLine(test);
        }

        public static void TestI(ref string test)
        {
            test = "after passing";
        }
    }

#2 РЎreate класс, куда мы передаем значение

  public static void Main()
        {
            DATA.Str = "before passing";
            Console.WriteLine(DATA.Str);
            TestI("after passing");
            Console.WriteLine(DATA.Str);
        }
        public class DATA
        {
            public static string Str { get; set; } = "";
        }
        public static void TestI(string  text)
        {
            DATA.Str = text;
        }

обмен данными Использования #3 через потоки

    class Test
    {
        public static void Main()
        {
            Thread.SetData(Thread.GetNamedDataSlot("memory"), "before passing");
            var n = Thread.GetData(Thread.GetNamedDataSlot("memory"));
            Console.WriteLine(n);
            TestI("after passing");
            n = Thread.GetData(Thread.GetNamedDataSlot("memory"));
            Console.WriteLine(n);
        }

        public static void TestI(string  text)
        {
            Thread.SetData(Thread.GetNamedDataSlot("memory"), text);
        }
    }
0
ответ дан 23 November 2019 в 21:51
поделиться

Попробуйте:


public static void TestI(ref string test)
    {
        test = "after passing";
    }
-1
ответ дан 23 November 2019 в 21:51
поделиться

На самом деле это было бы одинаково для любого объекта в этом отношении, то есть быть ссылочным типом и передавать по ссылке - это две разные вещи в C #.

Это будет работать, но это применимо независимо от типа:

public static void TestI(ref string test)

Также о том, что строка является ссылочным типом, это тоже особый тип. Он разработан, чтобы быть неизменным, поэтому все его методы не будут изменять экземпляр (они возвращают новый). В нем также есть кое-что для повышения производительности.

9
ответ дан 23 November 2019 в 21:51
поделиться

Ссылка на строку передается по значению. Есть большая разница между передачей ссылки по значению и передачей объекта по ссылке. К сожалению, слово «ссылка» используется в обоих случаях.

Если вы сделаете передадите строковую ссылку по ссылке, она будет работать так, как вы ожидаете:

using System;

class Test
{
    public static void Main()
    {
        string test = "before passing";
        Console.WriteLine(test);
        TestI(ref test);
        Console.WriteLine(test);
    }

    public static void TestI(ref string test)
    {
        test = "after passing";
    }
}

Теперь вам нужно различать внесение изменений в объект, на который ссылается ссылка, и внесение изменений в переменную (например, параметр), чтобы она могла ссылаться на другой объект. Мы не можем вносить изменения в строку, потому что строки неизменяемы, но мы можем продемонстрировать это с помощью StringBuilder вместо этого:

using System;
using System.Text;

class Test
{
    public static void Main()
    {
        StringBuilder test = new StringBuilder();
        Console.WriteLine(test);
        TestI(test);
        Console.WriteLine(test);
    }

    public static void TestI(StringBuilder test)
    {
        // Note that we're not changing the value
        // of the "test" parameter - we're changing
        // the data in the object it's referring to
        test.Append("changing");
    }
}

Подробнее см. в моей статье о передаче параметров .

204
ответ дан 23 November 2019 в 21:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: