C# (C Sharp) programming
По всем вопросам- @notxxx1 Реестр РКН: https://clck.ru/3Fk3kb #VRHSZ
Show more📈 Analytical overview of Telegram channel C# (C Sharp) programming
Channel C# (C Sharp) programming (@csharp_ci) in the Russian language segment is an active participant. Currently, the community unites 18 126 subscribers, ranking 7 040 in the Technologies & Applications category and 36 424 in the Russia region.
📊 Audience metrics and dynamics
Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 18 126 subscribers.
According to the latest data from 04 September, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -55 over the last 30 days and by -9 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 14.53%. Within the first 24 hours after publication, content typically collects 7.50% reactions from the total number of subscribers.
- Post reach: On average, each post receives 2 635 views. Within the first day, a publication typically gains 1 360 views.
- Reactions and interaction: The audience actively supports content: the average number of reactions per post is 0.
- Thematic interests: Content is focused on key topics such as .net, api, логика, архитектура, string.
📝 Description and content policy
The author describes the resource as a platform for expressing subjective opinions:
“По всем вопросам- @notxxx1
Реестр РКН: https://clck.ru/3Fk3kb
#VRHSZ”
Thanks to the high frequency of updates (latest data received on 05 September, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.
IWebElement loginButton = driver.FindElement(By.Id("login-button"));
loginButton.Click();
Ввод текста в поле для поиска
IWebElement searchBox = driver.FindElement(By.Name("search"));
searchBox.SendKeys("Selenium testing");
Выбор опции "Черный" из выпадающего списка цветов
IWebElement colorDropdown = driver.FindElement(By.Id("color-selector"));
SelectElement colorSelect = new SelectElement(colorDropdown);
colorSelect.SelectByText("Черный");
Вход на сайт и проверка успешной авторизации
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
[TestFixture]
public class LoginTests
{
IWebDriver driver;
[SetUp]
public void SetUp()
{
driver = new ChromeDriver();
driver.Navigate().GoToUrl("https://www.example.com/login");
}
[Test]
public void TestSuccessfulLogin()
{
IWebElement usernameInput = driver.FindElement(By.Id("username"));
IWebElement passwordInput = driver.FindElement(By.Id("password"));
IWebElement loginButton = driver.FindElement(By.Id("login-button"));
usernameInput.SendKeys("myUsername");
passwordInput.SendKeys("myPassword");
loginButton.Click();
IWebElement welcomeMessage = driver.FindElement(By.CssSelector(".welcome-message"));
Assert.AreEqual("Welcome, User!", welcomeMessage.Text);
}
[TearDown]
public void TearDown()
{
driver.Quit();
}
}
📌 Читать дальше
@csharp_ciclass Singleton
{
private static Singleton instance;
private Singleton()
{}
public static Singleton getInstance()
{
if (instance == null)
instance = new Singleton();
return instance;
}
}
В классе определяется статическая переменная - ссылка на конкретный экземпляр данного объекта и приватный конструктор. В статическом методе getInstance() этот конструктор вызывается для создания объекта, если, конечно, объект отсутствует и равен null.
Для применения паттерна Одиночка создадим небольшую программу. Например, на каждом компьютере можно одномоментно запустить только одну операционную систему. В этом плане операционная система будет реализоваться через паттерн синглтон:
class Program
{
static void Main(string[] args)
{
Computer comp = new Computer();
comp.Launch("Windows 8.1");
Console.WriteLine(comp.OS.Name);
// у нас не получится изменить ОС, так как объект уже создан
comp.OS = OS.getInstance("Windows 10");
Console.WriteLine(comp.OS.Name);
Console.ReadLine();
}
}
class Computer
{
public OS OS { get; set; }
public void Launch(string osName)
{
OS = OS.getInstance(osName);
}
}
class OS
{
private static OS instance;
public string Name { get; private set; }
protected OS(string name)
{
this.Name=name;
}
public static OS getInstance(string name)
{
if (instance == null)
instance = new OS(name);
return instance;
}
}
Синглтон и многопоточность
При применении паттерна синглтон в многопоточным программах мы можем столкнуться с проблемой, которую можно описать следующим образом:
static void Main(string[] args)
{
(new Thread(() =>
{
Computer comp2 = new Computer();
comp2.OS = OS.getInstance("Windows 10");
Console.WriteLine(comp2.OS.Name);
})).Start();
Computer comp = new Computer();
comp.Launch("Windows 8.1");
Console.WriteLine(comp.OS.Name);
Console.ReadLine();
}
Здесь запускается дополнительный поток, который получает доступ к синглтону. Параллельно выполняется тот код, который идет запуска потока и кторый также обращается к синглтону. Таким образом, и главный, и дополнительный поток пытаются инициализровать синглтон нужным значением - "Windows 10", либо "Windows 8.1". Какое значение сиглтон получит в итоге, пресказать в данном случае невозможно.
Вывод программы может быть такой:
Windows 8.1
Windows 10
Или такой:
Windows 8.1
Windows 8.1
В итоге мы сталкиваемся с проблемой инициализации синглтона, когда оба потока одновременно обращаются к коду:
if (instance == null)
instance = new OS(name);
Чтобы решить эту проблему, перепишем класс синглтона следующим образом:
class OS
{
private static OS instance;
public string Name { get; private set; }
private static object syncRoot = new Object();
protected OS(string name)
{
this.Name = name;
}
public static OS getInstance(string name)
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new OS(name);
}
}
return instance;
}
}
Чтобы избежать одновременного доступа к коду из разных потоков критическая секция заключается в блок lock.
📌 Статья
@csharp_ciНативная интеграция. Информация о продукте www.otus.ru
using System;
using System.Collections.Generic;
using System.Linq;
namespace ModularityAndReusabilityExample
{
class Program
{
static void Main(string[] args)
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
int sum = numbers.Sum();
int product = numbers.Product();
Console.WriteLine("Sum: " + sum);
Console.WriteLine("Product: " + product);
}
}
public static class Extensions
{
public static int Product(this IEnumerable<int> source)
{
return source.Aggregate(1, (acc, x) => acc * x);
}
}
}
В этом примере мы создали список чисел и использовали два метода расширения для вычисления суммы и произведения этих чисел. Метод Sum — это встроенный метод, предоставляемый C#, а метод Product — это пользовательский метод расширения, который мы определили сами.
Инкапсулировав логику вычисления произведения списка чисел в отдельный метод, мы создали высокомодульный и многократно используемый фрагмент кода. Этот метод расширения можно повторно использовать в различных приложениях и при необходимости легко модифицировать или расширять.
Кроме того, использование методов расширения позволяет писать более выразительный и читабельный код. Вместо того чтобы писать цикл для вычисления произведения чисел, мы можем просто вызвать метод расширения Product для списка чисел. Это делает код более простым, лаконичным и удобным для чтения.
В целом преимущества функционального программирования, связанные с модульностью и возможностью повторного использования, позволяют создавать хорошо поддерживаемый и масштабируемый код. Разбивая сложные задачи на более мелкие, независимые функции, мы можем создать библиотеку композитных функций, которые можно повторно использовать в различных приложениях.
Используя возможности C# и функционального программирования, разработчики могут создавать надежные и масштабируемые программные системы, рассчитанные на длительную эксплуатацию.
📌 Читать дальше
@csharp_ci