6 / 4 / 3
Регистрация: 23.10.2010
Сообщений: 289
1

Разъясните, пожалуйста, как работает this

19.08.2019, 22:52. Показов 855. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Есть небольшой примерчик программы которая подсчитывает количество определенных символов

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void button1_Click(object sender, EventArgs e)
        {
            string s1 = "Привет мир, Привет мир, Привет мир";
            string s = "Привет мир";
            char c = 'и';
            int i = s.WordCount(c);
            MessageBox.Show(i.ToString());   
        }
 
 
public static int WordCount(this string str, char c)
        {
            int counter = 0;
            for (int i = 0; i < str.Length; i++)
            {
                if (str[i] == c)
                    counter++;
            }
            return counter;
        }
Почему через this передается именно s, а s1 не используется? Строки менял местами, все равно использует только s. Как работает этот this?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.08.2019, 22:52
Ответы с готовыми решениями:

Первая программа на C#. Разъясните кое-что , пожалуйста
Здравствуйте! Вот , собственно , моя первая попытка , решение квадратного уравнения: using...

Паттерн MVC. Разъясните для чайника на пальцах пожалуйста
Подскажите и проясните пробелы в этой теме, а то немного не догоняю. Проблема стара как мир, но...

Разъясните пожалуйста как работает эта часть кода
K = 0 ' (ПОЯСНИТЕ ВОТ ЭТО ПОЧЕМУ 0) For i = 1 To 4 ' (Это Я знаю наверное цикл, который...

разъясните,пожалуйста, как это сделать?
Дано целое число N (&gt; 0). Найти значение выражения 1.1 – 1.2 + 1.3 – … (N слагаемых, знаки...

15
6 / 4 / 3
Регистрация: 23.10.2010
Сообщений: 289
19.08.2019, 23:01  [ТС] 2
не использует он только с. Просто у вас 2 строки начинаются одинаково вот и результат одинаковый
Строки разные в одной количество 'и' = 2 в другой 'и' = 6
0
1514 / 905 / 328
Регистрация: 17.05.2015
Сообщений: 3,417
19.08.2019, 23:04 3
WersaT, да код не так прочитал сначала.
Я не уверен, но возможно это интернирование строк.
https://habr.com/ru/post/172627/

Добавлено через 1 минуту
Возможно эти строки, состоящие из одних и тех же символов, ссылаются на одни и те же символы в памяти
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
19.08.2019, 23:05 4
Цитата Сообщение от WersaT Посмотреть сообщение
Почему через this передается именно s, а s1 не используется?
Потому что вы в коде передаете туда s, а не s1.
1
6 / 4 / 3
Регистрация: 23.10.2010
Сообщений: 289
19.08.2019, 23:06  [ТС] 5
А как определять какую строку метод с this будет использовать?
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
19.08.2019, 23:08 6
Цитата Сообщение от WersaT Посмотреть сообщение
А как определять какую строку метод с this будет использовать?
Ну на какой переменной вызвали, ту и будет использовать.

У вас написано:
Цитата Сообщение от WersaT Посмотреть сообщение
C#
1
int i = s.WordCount(c);
Метод вызывается с переменной s, вот она и используется.
Если поменяете на int i = s1.WordCount(c);, то получите ожидаемое 6.
0
6 / 4 / 3
Регистрация: 23.10.2010
Сообщений: 289
19.08.2019, 23:10  [ТС] 7
kolorotur, спасибо.
Блин, на s не обратил внимания, больше не буду по ночам читать литературу сложнее сказки)))
Еще раз спасибо
0
Модератор
Эксперт .NET
15463 / 10708 / 2786
Регистрация: 21.04.2018
Сообщений: 31,522
Записей в блоге: 2
19.08.2019, 23:17 8
Цитата Сообщение от WersaT Посмотреть сообщение
Как работает этот this?
public static int WordCount(this string str, char c) - это метод расширения. См. https://metanit.com/sharp/tutorial/3.18.php , https://docs.microsoft.com/ru-... on-methods
0
5 / 18 / 6
Регистрация: 15.10.2017
Сообщений: 161
20.08.2019, 23:25 9
Цитата Сообщение от WersaT Посмотреть сообщение
Как работает этот this
Это указатель на что-то текущего обьекта.
Ну вот смотрите:
C#
1
2
3
4
5
6
7
8
9
class Hello
{
private string name = "Petro"; 
private void myHello(string name = "Igor") // В этой функции аргумент имеет string name точно такое же имя как у нашей переменной в классе 
{
Console.Write("Your name: " + name); // Получим Igor по DEFAULT или то что нам в функцию вкинули! Мы не ставим this и выводим name тот что в этой функции!!! В ее аргументе!
Console.Write("Your name: " + this.name); // Получим Petro Здесь мы говорим покажи ЭТОТ name (покажи текущий наш name на текущем обьекте!!!!) Именно вот этот name который у нас в классе а не в этой функции!!!
}
}
Пример писал вот сходу не тестируя, если что пишите спасибо.
0
Модератор
Эксперт .NET
15463 / 10708 / 2786
Регистрация: 21.04.2018
Сообщений: 31,522
Записей в блоге: 2
20.08.2019, 23:35 10
Цитата Сообщение от Terabiterr Посмотреть сообщение
Это указатель на что-то текущего обьекта.
Вы не вникли в тему.
В примере от WersaT this в параметрах статического метода.
Значит это метод расширения, в данном случае, типа string.
0
5 / 18 / 6
Регистрация: 15.10.2017
Сообщений: 161
20.08.2019, 23:47 11
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вы не вникли в тему.
В примере от WersaT this в параметрах статического метода.
Значит это метод расширения, в данном случае, типа string.
Я и вник в тему, и написал пример с this потому что как говорит уважаемый koloroturint i = s.WordCount(c);

передать this

и вот мой отрывок из примера:
C#
1
2
private void myHello(string name = "Igor").....
Console.Write("Your name: " + this.name);
0
Модератор
Эксперт .NET
15463 / 10708 / 2786
Регистрация: 21.04.2018
Сообщений: 31,522
Записей в блоге: 2
20.08.2019, 23:53 12
Цитата Сообщение от Terabiterr Посмотреть сообщение
вот мой отрывок из примера:
Я его видел.
В примере WersaT в коде только в одной строке this
C#
11
public static int WordCount(this string str, char c)
0
5 / 18 / 6
Регистрация: 15.10.2017
Сообщений: 161
21.08.2019, 00:07 13
Элд Хасп, нечего особенного , вот ответ
Взял с quaru
Это синтаксис для объявления методов расширения, новая функция С# 3.0.

Метод расширения - это код части, компилятор части "магия", где компилятор с помощью intellisense в Visual Studio показывает, что ваш метод расширения фактически доступен как метод экземпляра для рассматриваемого объекта.

Позвольте мне привести пример.

В классе String, который называется GobbleGobble, нет метода, поэтому создайте метод расширения:
C#
1
2
3
4
5
6
7
public static class StringExtensions
{
    public static void GobbleGobble(this string s)
    {
        Console.Out.WriteLine("Gobble Gobble, " + s);
    }
}
Имя класса - это просто мое соглашение об именах, нет необходимости называть его таким, но оно должно быть статическим, как и метод.

После объявления вышеуказанного метода вы можете в Visual Studio ввести следующее:

String s = "Turkey Baster!";
s.
после точки, дождитесь intellisense и обратите внимание, что там есть метод GobbleGobble, выполните следующий код:

String s = "Turkey Baster!";
s.GobbleGobble();
Важно. Класс, в котором объявлен метод расширения, должен быть доступен компилятору и процессору intellisense для того, чтобы intellisense отображал этот метод. Если вы вручную вводите GobbleGobble и используете ярлык Ctrl + ., это не поможет вам получить правильное использование директив в файле.

Обратите внимание, что параметр метода исчез. Компилятор будет молча перемещаться по важным битам, которые:

String s = "Turkey Baster!";
s.GobbleGobble();
^ ^
| +-- the compiler will find this in the StringExtensions class
|
+-- will be used as the first parameter to the method
Таким образом, приведенный выше код будет преобразован компилятором в следующее:

String s = "Turkey Baster!";
StringExtensions.GobbleGobble(s);
Итак, во время вызова нет ничего волшебного в этом, это просто вызов статического метода.

Обратите внимание, что если ваш метод расширения объявляет более одного параметра, только первый поддерживает модификатор this, а остальные должны быть указаны как часть вызова метода как обычно:

public static void GobbleGobble(this string value, string extra)
{ | |
... | |
} | |
| |
+--------------------------------------------+ |
| |
v |
s.GobbleGobble("extra goes here"); |
^ |
| |
+-----------------------------------+
Методы расширения были добавлены частично из-за Linq, где синтаксис Linq С# будет искать подходящие именованные методы расширения для объектов в игре, что означает, что вы можете "внедрить" Linq-поддержку в любой тип класса, просто объявив правильные методы расширения. Конечно, полная поддержка Linq - это большая работа, но это возможно.

Кроме того, сами методы расширения действительно полезны, поэтому читайте на нем.
0
3560 / 2501 / 1174
Регистрация: 14.08.2016
Сообщений: 8,206
21.08.2019, 00:15 14
Terabiterr, ни разу не встречал, даже упоминания о существовании, не статических имен методов
0
Модератор
Эксперт .NET
15463 / 10708 / 2786
Регистрация: 21.04.2018
Сообщений: 31,522
Записей в блоге: 2
21.08.2019, 00:33 15
Цитата Сообщение от Terabiterr Посмотреть сообщение
нечего особенного , вот ответ
Взял с quaru....
И...???
Зачем вы всё это выложили?
Какое отношение это имеет к вопросу в теме?
0
5 / 18 / 6
Регистрация: 15.10.2017
Сообщений: 161
21.08.2019, 00:39 16
Элд Хасп, извиняюсь не заметил что вы уже две ссылки показывали за this в аргумент
1
21.08.2019, 00:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.08.2019, 00:39
Помогаю со студенческими работами здесь

Разъясните пожалуйста как хранятся символы в видео памяти
Дело во в чем. Надо написать программу по выводу того что на экране, снова на экран. Вроде все ок,...

Ребят, разъясните, пожалуйста, как сделать код, позволяющий заполнить одномерный массив
Ребят, разъясните, пожалуйста, как сделать код, позволяющий заполнить одномерный массив вида: ...

Разъясните пожалуйста
Всем привет.Вот столкнулась я с такой задачкой. Нужно написать калькулятор : Реализация...

Разъясните пожалуйста
int sd(int n, int d = 1) { if(n == 0) { return 0; } else { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru