C \ # 6 / 7 새로운 기능
1. C \ # 역사 변천
C# 1,Visual Studio .NET 2002:
C# 1.1,Visual Studio .NET 2003:
C# 2,Visual Studio .NET 2005:
C# 3,Visual Studio .NET 2008:
C# 4,Visual Studio .NET 2010:
C# 5,Visual Studio .NET 2012:
1. 확장 자동 속성 문법
자동 속성 초기 화 표현 식.
public class Example
{
// 6.0 :
public string FirstName { get; set; } = "Monkey";
// 6.0
private string _firstName = "Monkey";
public string FirstName
{
get { return _firstName; }
set { _firstName = value; }
}
}
자동 속성 만 읽 기 (읽 기 전용 자동 프로 퍼티)
구조 함수 나 속성 초기 화 표현 식 에서 만 속성 을 설정 할 수 있 습 니 다.
public class Example
{
public string FirstName { get; } = "Monkey";
public string LastName { get; }
public Example(string lastName)
{
LastName = lastName;
}
}
2. 표현 식 주체 (Expression - bodied function members)
표현 식 주체 정 의 를 통 해 매우 간결 한 읽 기 가능 한 형식 으로 구성원 의 실현 문법 을 제공 할 수 있 습 니 다.
member => expression;
C \ # 6 지원: 속성 Get, 방법
//
private static string SayHello() => "Hello World";
// Get
public string FullName => $"{FirstName} {LastName}";
3. 정적 클래스 가 져 오기 (static 사용)
형식 이름 을 제한 하지 않 고 접근 할 수 있 는 정적 구성원 을 허용 합 니 다: r
using staticSystem.String
if (IsNullOrWhiteSpace(lastName))
throw new ArgumentException(message: "Cannot be blank", paramName: nameof(lastName));
메모: 확장 방법 은 이 방식 을 사용 할 수 없습니다.
using static System.Linq.Enumerable;
public bool MakesDeansList()
{
return Grades.All(g => g > 3.5) && Grades.Any();
// Code below generates CS0103:
// The name 'All' does not exist in the current context.
//return All(Grades, g => g > 3.5) && Grades.Any();
}
4. Null 조건 연산 자
구성원 접근 (?.): value = = null 이면 null 로 돌아 갑 니 다.
public static string Truncate(string value, int length)
{
/
return value?.Substring(0, Math.Min(value.Length, length));
// C# 6.0
//string result = value;
//if (value != null)
//{
// result = value.Substring(0, Math.Min(value.Length, length));
//}
//return result;
}
색인 (? [) 동작:
List examples = null;
Example example = examples?[0];
// Example? item = (examples != null) ? examples[0] : null
Console.WriteLine(example == null); // True
5. 문자열 삽입 값 (문자열 보 간)
public string GetFormattedGradePoint() =>
$"Name: {LastName}, {FirstName}. G.P.A: {Grades.Average()}";
public string GetGradePointPercentage() =>
$"Name: {LastName}, {FirstName}. G.P.A: {Grades.Average():F2}";
public string GetGradePointPercentages() =>
$"Name: {LastName}, {FirstName}. G.P.A: {Grades.Any() ? Grades.Average() : double.NaN:F2}";
public string GetGradePointPercentages() =>
$"Name: {LastName}, {FirstName}. G.P.A: {(Grades.Any() ? Grades.Average() : double.NaN):F2}";
public string GetAllGrades() =>
$@"All Grades: {Grades.OrderByDescending(g => g)
.Select(s => s.ToString("F2")).Aggregate((partial, element) => $"{partial}, {element}")}";
6. 이상 필터 (필터 제외)
catch (ArgumentNullException e) when (e.ParamName == “…”)
{
}
괄호 표현 식 (when) 의 결과 가 true 일 때 만 catch 블록 에 해당 하 는 문 구 를 실행 합 니 다. 그렇지 않 으 면 계속 검색 처리 프로그램 을 실행 합 니 다.
사용 필드: http 처리
public static async Task MakeRequestWithNotModifiedSupport()
{
var client = new System.Net.Http.HttpClient();
var streamTask = client.GetStringAsync("https://localHost:10000");
try {
var responseText = await streamTask;
return responseText;
} catch (System.Net.Http.HttpRequestException e) when (e.Message.Contains("301"))
{
return "Site Moved";
} catch (System.Net.Http.HttpRequestException e) when (e.Message.Contains("304"))
{
return "Use the Cache";
}
}
7. nameof 표현 식
필드 사용: 잘못된 매개 변수 이름 가 져 오기
if (IsNullOrWhiteSpace(lastName))
throw new ArgumentException(message: "Cannot be blank", paramName: nameof(lastName));
사용 장면: INotifyProperty Changed 인터페이스 감청 속성 변 화 를 사용 합 니 다.
public string LastName
{
get { return lastName; }
set
{
if (value != lastName)
{
lastName = value;
PropertyChanged?.Invoke(this,
new PropertyChangedEventArgs(nameof(LastName)));
}
}
}
private string lastName;
메모: Nameof 는 Member 의 문자열 만 되 돌려 줍 니 다. 앞 에 대상 이나 네 임 스페이스 가 있 으 면 Nameof 는 되 돌려 줍 니 다. 마지막 부분, 그리고 Nameof 는 지원 되 지 않 는 경우 가 많 습 니 다. 예 를 들 어 방법, 키워드, 대상 의 인 스 턴 스 와 문자열, 표현 식 등 입 니 다.
8. catch 와 finally 블록 에 키워드 await 사용 하기
public static async Task MakeRequestAndLogFailures()
{
await logMethodEntrance();
var client = new System.Net.Http.HttpClient();
var streamTask = client.GetStringAsync("https://localHost:10000");
try {
var responseText = await streamTask;
return responseText;
} catch (System.Net.Http.HttpRequestException e) when (e.Message.Contains("301"))
{
await logError("Recovered from redirect", e);
return "Site Moved";
}
finally
{
await logMethodExit();
client.Dispose();
}
}
9. 색인 초기 화기 (Index Initializers)
private List messages = new List
{
"Page not Found",
"Page moved, but left a forwarding address.",
"The web server can't come out to play today."
};
private Dictionary webErrors = new Dictionary
{
[404] = "Page not Found",
[302] = "Page moved, but left a forwarding address.",
[500] = "The web server can't come out to play today."
};
3. C \ # 7 의 새로운 기능 (Visual Studio. NET 2017)
1. out 변수
/ / 이전 버 전
int numericResult;
if (int.TryParse(input, out numericResult))
WriteLine(numericResult);
else
WriteLine("Could not parse input");
C \ # 7 매개 변수 목록 에서 변 수 를 설명 합 니 다.
if (int.TryParse(input, out int result))
WriteLine(result);
else
WriteLine("Could not parse input");
2. 원조 (Tuples)
인용 패키지 필요: System. ValueTuple
원 그룹 은 경량급 데이터 구조 로 여러 필드 를 포함 하여 데이터 구성원 을 표시 합 니 다.
var unnamed = ("one", "two");// Item1、Item2、Item3......
var named = (first: "one", second: "two");
(string Alpha, string Beta) namedLetters = ("a", "b");
var alphabetStart = (Alpha: "a", Beta: "b");
원본 그룹 은 페이지 결과 가 집 중 된 데이터 와 총 줄 수 와 같은 private 와 internal 방법의 반환 형식 으로 가장 적합 합 니 다.
private static (int Max, int Min) Range(IEnumerable numbers)
{
int min = int.MaxValue;
int max = int.MinValue;
foreach(var n in numbers)
{
min = (n < min) ? n : min;
max = (n > max) ? n : max;
}
return (max, min);
}
참고:https://docs.microsoft.com/zh-cn/dotnet/csharp/tuples
3. 버 림 (버 림)
C \ # 7 부터 C \ # 포 기 를 지원 합 니 다. 프로그램 코드 에서 인위적으로 사용 을 취소 하 는 임시 가상 변수 입 니 다. 할당 되 지 않 은 변 수 를 포기 합 니 다. 값 이 없습니다. 변 수 를 포기 하고 저장 공간 을 할당 하지 않 기 때문에 버 리 면 메모리 분 배 를 줄 일 수 있 습 니 다.
장면 1: 원조 와 대상 분석 1
var (_, _, area) = city.GetCityInformation(cityName);
public class Example
{
public static void Main()
{
Person p = new Person("John", "Quincy", "Adams", "Boston", "MA");
//
// Deconstruct the person object.
var (fName, _, city, _) = p;
Console.WriteLine($"Hello {fName} of {city}!");
// The example displays the following output:
// Hello John of Boston!
//
}
}
필드 2: out 매개 변수 사용
if (DateTime.TryParse(dateString, out _))
Console.WriteLine($"'{dateString}': valid");
장면 3: 독립 버 림
using System;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
ExecuteAsyncMethods().Wait();
}
private static async Task ExecuteAsyncMethods()
{
Console.WriteLine("About to launch a task...");
_ = Task.Run(() => { var iterations = 0;
for (int ctr = 0; ctr < int.MaxValue; ctr++)
iterations++;
Console.WriteLine("Completed looping operation...");
throw new InvalidOperationException();
});
await Task.Delay(5000);
Console.WriteLine("Exiting after 5 second delay");
}
}
// The example displays output like the following:
// About to launch a task...
// Completed looping operation...
// Exiting after 5 second delay
장면 4: switch 와 is 모드 를 사용 하여 일치 합 니 다.
참고:https://docs.microsoft.com/zh-cn/dotnet/csharp/discards
4. 패턴 일치 (패턴 일치)
is 형식 모드 표현 식: 기 존 문법 최적화
public static double ComputeAreaModernIs(object shape)
{
if (shape is Square s)
return s.Side * s.Side;
else if (shape is Circle c)
return c.Radius * c.Radius * Math.PI;
else if (shape is Rectangle r)
return r.Height * r.Length;
// elided
throw new ArgumentException(
message: "shape is not a recognized shape",
paramName: nameof(shape));
}
if (! (shape is Square s) 를 작성 하여 논 리 를 반전 시 킵 니 다. 변 수 는 false 분기 에서 만 명확 하 게 할당 합 니 다.
사용 모드 매 칭 switch 문장
public static double ComputeAreaModernSwitch(object shape)
{
switch (shape)
{
case Square s:
return s.Side * s.Side;
case Circle c:
return c.Radius * c.Radius * Math.PI;
case Rectangle r:
return r.Height * r.Length;
default:
throw new ArgumentException(
message: "shape is not a recognized shape",
paramName: nameof(shape));
}
}
case 표현 식 의 when 문장
public static double ComputeArea_Version5(object shape)
{
switch (shape)
{
case Square s when s.Side == 0:
case Circle c when c.Radius == 0:
case Triangle t when t.Base == 0 || t.Height == 0:
case Rectangle r when r.Length == 0 || r.Height == 0:
return 0;
case Square s:
return s.Side * s.Side;
case Circle c:
return c.Radius * c.Radius * Math.PI;
case Triangle t:
return t.Base * t.Height * 2;
case Rectangle r:
return r.Length * r.Height;
//
case null:
throw new ArgumentNullException(paramName: nameof(shape), message: "Shape must not be null");
default:
throw new ArgumentException(
message: "shape is not a recognized shape",
paramName: nameof(shape));
}
}
참고:https://docs.microsoft.com/zh-cn/dotnet/csharp/pattern-matching
5. ref 반환 값 과 부분 변수 (ref locals and returns)
반환 값 허용 방법 을 참조 하여 대상 의 인용 (값 이 아 닌) 을 호출 자 에 게 되 돌려 줍 니 다. 그리고 호출 자 는 되 돌아 오 는 대상 을 값 에 따라 되 돌려 주거 나 인용 에 따라 되 돌려 줍 니 다. 인용 에 따라 되 돌아 오 는 값 을 호출 자가 인용 (값 이 아 닌) 으로 처리 하면 이 값 은 ref 부분 변수 입 니 다.
예시
FindNumber 방법 은 인용 에 따라 매개 변수 로 전달 되 는 첫 번 째 숫자 보다 크 거나 같은 숫자 를 되 돌려 줍 니 다. 이 매개 변수 보다 크 거나 같은 숫자 가 없 으 면 색인 0 의 숫자 를 되 돌려 줍 니 다.
using System;
class NumberStore
{
int[] numbers = { 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023 };
public ref int FindNumber(int target)
{
for (int ctr = 0; ctr < numbers.Length; ctr++) {
if (target == numbers[ctr]) {
return ref numbers[ctr];
}
else if (ctr == numbers.Length - 1) {
return ref numbers[ctr];
}
else if (target < numbers[ctr]) {
if (ctr > 0 && target > numbers[ctr - 1])
return ref numbers[ctr];
else if (ctr == 0)
return ref numbers[0];
}
}
return ref numbers[0];
}
public override string ToString()
{
string retval = "";
for (int ctr = 0; ctr < numbers.Length; ctr++) {
retval += $"{numbers[ctr]} ";
}
return retval.Trim();
}
}
예제 에서 보 듯 이 이 변경 사항 은 NumberStore 인 스 턴 스 의 배열 요소 값 에 반 영 됩 니 다.
using System;
public class Example
{
static void Main(string[] args)
{
var store = new NumberStore();
Console.WriteLine($"Original sequence: {store.ToString()}");
int number = 16;
ref var value = ref store.FindNumber(number);
value*=2;
Console.WriteLine($"New sequence: {store.ToString()}");
}
}
// The example displays the following output:
// Original sequence: 1 3 7 15 31 63 127 255 511 1023
// New sequence: 1 3 7 15 62 63 127 255 511 1023
참고:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/ref-returns
6.Local Functions
C \ # 7 부터 C \ # 로 컬 함 수 를 지원 합 니 다. 로 컬 함 수 는 다른 구성원 에 포 함 된 형식의 개인 적 인 방법 입 니 다. 포 함 된 구성원 에서 만 호출 할 수 있 습 니 다. 다음 위치 에서 로 컬 함 수 를 설명 하고 호출 할 수 있 습 니 다.
using System;
using System.IO;
class Example
{
static void Main()
{
string contents = GetText(@"C:\temp", "example.txt");
Console.WriteLine("Contents of the file:
" + contents);
}
private static string GetText(string path, string filename)
{
var sr = File.OpenText(AppendPathSeparator(path) + filename);
var text = sr.ReadToEnd();
return text;
// Declare a local function.
string AppendPathSeparator(string filepath)
{
if (! filepath.EndsWith(@"\"))
filepath += @"\";
return filepath;
}
}
}
참고:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/local-functions
7. 더 많은 표현 식 주체 구성원 (More expression - bodied members)
C \ # 7 지원: 구조 함수, 종결 기, 속성 집합 문, 색인 기
구조 함수
public class Location
{
private string locationName;
public Location(string name) => locationName = name;
}
종결 기
using System;
public class Destroyer
{
public override string ToString() => GetType().Name;
~Destroyer() => Console.WriteLine($"The {ToString()} destructor is executing.");
}
속성 세트 문장,
public class Location
{
public string Name
{
get => locationName;
set => locationName = value;
}
}
색인 기
using System;
using System.Collections.Generic;
public class Sports
{
private string[] types = { "Baseball", "Basketball", "Football",
"Hockey", "Soccer", "Tennis",
"Volleyball" };
public string this[int i]
{
get => types[i];
set => types[i] = value;
}
}
참고:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/statements-expressions-operators/expressions#expression-body-definitions
8. throw 표현 식 (throw 표현 식)
C \ # 7 부터 throw 는 표현 식 과 문장 으로 사용 할 수 있 습 니 다. 이전에 지원 하지 않 았 던 상하 문 에서 이상 을 일 으 킬 수 있 습 니 다.
조건 부 연산 자
private static void DisplayFirstNumber(string[] args)
{
string arg = args.Length >= 1 ? args[0] :
throw new ArgumentException("You must supply an argument");
if (Int64.TryParse(arg, out var number))
Console.WriteLine($"You entered {number:F0}");
else
Console.WriteLine($"{arg} is not a number.");
}
null 병합 연산 자
public string Name
{
get => name;
set => name = value ??
throw new ArgumentNullException("Name cannot be null", nameof(value));
}
expression - bodied lambda 또는 방법.
DateTime ToDateTime(IFormatProvider provider) =>
throw new InvalidCastException("Conversion to a DateTime is not supported.");
참고:https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/throw#the-throw-expression
9.Generalized async return types
10. 디지털 문법 개선 (숫자 문자 문법 개선)
2 진법
public const int One = 0b0001;
public const int Two = 0b0010;
public const int Four = 0b0100;
public const int Eight = 0b1000;
숫자 구분자
public const long BillionsAndBillions = 100_000_000_000;
public const double AvogadroConstant = 6.022_140_857_747_474e23;
public const decimal GoldenRatio = 1.618_033_988_749_894_848_204_586_834_365_638_117_720_309_179M;
레 퍼 런 스
https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.