Операторы C#
В переменных типа значения хранятся данные, а в переменных ссылочного типа хранятся ссылки на фактические данные.
Ссылочные типы также называются объектами.
Типы значений состоят из двух основных категорий:
Структуры делятся на следующие категории:
- Числовые типы
- bool
- Структуры, определяемые пользователем.
Для объявления ссылочных типов используются следующие ключевые слова:
В C# также предусмотрены следующие встроенные ссылочные типы:
Начиная с версии Visual C# 3.0 объявляемые в области метода переменные могут иметь неявный тип var.
Локальная переменная с неявным типом имеет строгую типизацию, как если бы тип был задан явно, только тип определяет компилятор.
Следующие два объявления i функционально являются эквивалентами:
var i = 10; // implicitly typed
int i = 10; //explicitly typed
Оператор if
bool condition = true;
if (condition)
{
Console.WriteLine("The variable is set to true.");
}
else
{
Console.WriteLine("The variable is set to false.");
}
Оператор switch
int caseSwitch = 1;
switch (caseSwitch)
{
case 1:
Console.WriteLine("Case 1");
break;
case 2:
Console.WriteLine("Case 2");
break;
default:
Console.WriteLine("Default case");
break;
}
Цикл for
for (int i = 1; i <= 5; i++)
{
Console.WriteLine(i);
}
Цикл foreach
int[] fibarray = new int[] { 0, 1, 1, 2, 3, 5, 8, 13 };
foreach (int element in fibarray)
{
System.Console.WriteLine(element);
}
System.Console.WriteLine();
В следующей таблице представлен список операторов C#, сгруппированных в порядке приоритета.
Операторы в каждой группе имеют одинаковый приоритет.
Категория оператора
|
Операторы
|
Основные
| |
Унарные
| |
Мультипликативные
| |
Аддитивные
| |
Сдвиг
| |
Относительные и тестирующие тип
| |
Равенство
| |
Логическое И
| |
Логическое ИСКЛЮЧАЮЩЕЕ ИЛИ
| |
Логическое ИЛИ
| |
Условное И
| |
Условное ИЛИ
| |
Поддержка значения NULL
| |
Условный оператор
| |
Присвоение и лямбда-выражение
|
Методы (Руководство по программированию на C#)
Метод представляет собой блок кода, содержащий набор инструкций. Программа инициирует выполнение операторов, вызывая метод и задавая необходимые аргументы метода.
В C# все инструкции выполняются в контексте метода. Метод Main является точкой входа для каждого приложения C#, и вызывается он средой CLR при запуске программы.
Сигнатуры метода
Методы объявляются в классе или в структуре путем указания уровня доступа, например public или private, необязательных модификаторов, например abstract или sealed, возвращаемого значения, имени метода и списка параметров этого метода.
Все вместе эти элементы образуют сигнатуру метода.
Передача параметров
В C# аргументы могут быть переданы параметрам либо по значению, либо по ссылке. Передача по ссылке позволяет изменять и сохранять измененные значения параметров членов функций, методов, свойств, индексаторов, операторов и конструкторов в вызывающей среде. Для передачи параметра по ссылке используйте ключевое слово ref или out. Для простоты в этом примере используется только ключевое слово ref.
static void SquareIt(int x)
// The parameter x is passed by value.
static void SquareIt(ref int x)
// The parameter x is passed by reference.
Неявно типизированные локальные переменные
// i is compiled as an int
var i = 5;
// s is compiled as a string
var s = "Hello";
// a is compiled as int[]
var a = new[] { 0, 1, 2 };
// expr is compiled as IEnumerable<Customer>
// or perhaps IQueryable<Customer>
var expr =
from c in customers
where c.City == "London"
select c;
// anon is compiled as an anonymous type
var anon = new { Name = "Terry", Age = 34 };
// list is compiled as List<int>
var list = new List<int>();
Ключевое слово var можно использовать в следующих контекстах:
в локальных переменных (переменных, объявленных в области действия метода), как показано в предыдущем примере;
Методы расширения
Методы расширения позволяют "добавлять" методы в существующие типы без создания нового производного типа, перекомпиляции или иного изменения исходного типа. Методы расширения представляют собой особую разновидность статического метода, но вызываются так же, как методы экземпляра в расширенном типе. Для клиентского кода, написанного на языках C# и Visual Basic, нет видимого различия между вызовом метода расширения и вызовом методов, фактически определенных в типе.
namespace ExtensionMethods
{
public static class MyExtensions
{
public static int WordCount(this String str)
{
return str.Split(new char[] { ' ', '.', '?' },
StringSplitOptions.RemoveEmptyEntries).Length;
}
}
}
Метод расширения WordCount можно ввести в область действия с помощью следующей директивы using:
using ExtensionMethods;
Его можно вызвать из приложения с помощью следующего синтаксиса:
string s = "Hello Extension Methods";
int i = s.WordCount();
Именованные и необязательные аргументы
В Visual C# 2010 появились именованные и необязательные аргументы. Именованные аргументы позволяют указать аргумент для определенного параметра, связав аргумент с именем параметра, а не с позицией параметра в списке параметров.Необязательные аргументы позволяют опускать аргументы для некоторых параметров. Оба подхода можно применять к методам, индексаторам, конструкторам и делегатам.
class NamedExample
{
static void Main(string[] args)
{
// The method can be called in the normal way, by using positional arguments.
Console.WriteLine(CalculateBMI(123, 64));
// Named arguments can be supplied for the parameters in either order.
Console.WriteLine(CalculateBMI(weight: 123, height: 64));
Console.WriteLine(CalculateBMI(height: 64, weight: 123));
// Named arguments can follow positional arguments.
Console.WriteLine(CalculateBMI(123, height: 64));
}
static int CalculateBMI(int weight, int height)
{
return (weight * 703) / (height * height);
}
}
Методы Async
Async с помощью функции можно вызывать асинхронные методы без использования явных обратных вызовов или вручную разделить ваш код через несколько методов или лямбда-выражения.
Функция Async была реализована в Visual Studio 2012.
// This Click event is marked with the async modifier.
private async void startButton_Click(object sender, RoutedEventArgs e)
{
await DoSomethingAsync();
}
private async Task DoSomethingAsync()
{
Task<int> delayTask = DelayAsync();
int result = await delayTask;
// The previous two statements may be combined into
// the following statement.
//int result = await DelayAsync();
Debug.WriteLine("Result: " + result);
}
private async Task<int> DelayAsync()
{
await Task.Delay(100);
return 5;
}
// Output:
// Result: 5
Полезный код
Преобразовать Base64 в файл
// данные из файла
string xmlContent = File.ReadAllText(@"C:\Temp\Test.txt");// корневой элемент XML
XElement newNode = XDocument.Parse(xmlContent).Root;// декодируем в байты строку base64
byte[] base64 = System.Convert.FromBase64String(newNode.Value);// сохраняем в нужный формат
File.WriteAllBytes(@"C:\Temp\test.zip", base64);