主頁 >  其他 > 從 C# 1.0 到 C# 9.0,歷代 C# 語言特性一覽

從 C# 1.0 到 C# 9.0,歷代 C# 語言特性一覽

2021-02-07 12:31:22 其他

本文內容

  • C# 版本歷史記錄
  • C# 版本特性說明
    • C# 7.0
      • 元組和棄元
      • 更多的 expression-bodied 成員
      • `out`變數
      • 異步 `Main` 方法
      • 模式匹配
      • 引發運算式
    • C# 8.0
      • 默認介面方法
      • 異步流
      • 索引和范圍
    • C# 9.0
      • Record
      • 頂級陳述句
      • 模式匹配增強
  • 參考鏈接

C# 版本歷史記錄

從 C# 1.0 到 C# 9.0,歷代 C# 語言特性一覽.png

說明:因為Markdown下維護這樣復雜的表格有一點麻煩,故,這里以圖片形式展示出來,如后續內容有更新,請點擊 這里 訪問原始筆記鏈接,為知筆記 的表格渲染在移動端表現不佳,為了獲得更好的閱讀體驗,請在電腦端訪問查看,

C# 版本特性說明

現在是 2021 年,相信 C# 7.0 以前的版本大家都應該沒有什么問題,因為像博主這樣的 90 后“中年”男人,接觸的都是這個版本的 C#,所以,在這里我們主要講解大家C# 7.0、8.0 以及 9.0 的語法特性,考慮到文章篇幅有限,這里選取的都是博主個人比較喜歡的語法特性,如果這里沒有你喜歡的特性,請參考文章末尾的參考鏈接,如果這里的特性你都不喜歡,請你馬上關掉這個網頁,愿這個世界:Love & Peace,可能你會感覺到我說話變得小心翼翼起來,因為這個世界上有種叫做“杠精”的生物,當它從我的只言片語里讀出那些挫敗感的時候,終于有了嘲笑我們這批步入30歲行列的90后的底氣,沒錯,我在最近的博客評論中被讀者“嘲諷”了,讓暴風雨來得更猛烈一些吧!

C# 7.0

在 C# 7.0 中,我個人比較喜歡的特性主要有以下幾個:元組和棄元更多的 expression-bodied 成員out 變數異步 Main 方法模式匹配引發運算式

元組和棄元

這個概念乍聽起來可能會有一點陌生,其實,按我的理解,這就是增強的元組語法,終于可以擺脫Item1Item2…啦:

 //示例1
(string Alpha, string Beta) namedLetters = ("a", "b");
Console.WriteLine($"{namedLetters.Alpha}, {namedLetters.Beta}");
 //示例2
var alphabetStart = (Alpha: "a", Beta: "b");
Console.WriteLine($"{alphabetStart.Alpha}, {alphabetStart.Beta}");
//示例3
int count = 5;
string label = "Colors used in the map";
var pair = (count, label);
Console.WriteLine(pair);

有一段時間,前端同事總和我吹噓 ES6 里面的解構多么多么好用!對此,我想說,C# 一樣可以解構,假設我們現在有下面的一個方法:

static (string, double, double) GetLocation() 
 {
    var city = "西安市";
    var lat = 33.42d;
    var lon = 107.40d;
    return (city, lon, lat);
}

這就是簡化后的元組的用法,如果是以前,我們還需要回傳一個Tuple<string, double, double>,此時,如果我們需要決議城市名稱及其經緯度,可以這樣做:

//示例4
(string city, double lon, double lat) = GetLocation();
Console.WriteLine($"{city},({lon},{lat})");

OK,那么什么又是棄元呢?繼續以上面的代碼為例,如果我不關心經緯度,只需要城市名稱又該怎么辦呢?人家的方法回傳的是一個3元的結果,而我們只需要其中的1元,此時,就有了所謂棄元的概念:

(string city, _, _) = GetLocation();
Console.WriteLine($"{city}");

在 C# 中可以使用下劃線_來表示要舍棄的元,是為棄元,怎么樣?你學會了嗎?

更多的 expression-bodied 成員

這部分同樣是經過強化的 Lambda 運算式,之前我們可以在成員函式和 只讀屬性上使用 Lambda 運算式,而現在,我們可以將其運用在建構式終結器以及 getset訪問器:

// Expression-bodied constructor
public ExpressionMembersExample(string label) => this.Label = label;

// Expression-bodied finalizer
~ExpressionMembersExample() => Console.Error.WriteLine("Finalized!");

private string label;

// Expression-bodied get / set accessors.
public string Label
{
    get => label;
    set => this.label = value ?? "Default label";
}

out變數

個人認為,這是一個非常不錯的改進,終于不用再單獨宣告out變數啦:

if (int.TryParse(input, out int result))
    Console.WriteLine(result);
else
    Console.WriteLine("Could not parse input");

異步 Main 方法

顧名思義,Main 方法現在可以支持 async 關鍵字啦:

static async Task<int> Main()
{
    // This could also be replaced with the body
    // DoAsyncWork, including its await expressions:
    return await DoAsyncWork();
}

在沒有回傳值的情況下,可以考慮回傳Task:

static async Task Main()
{
    await SomeAsyncMethod();
}

模式匹配

主要是針對 isswitch 陳述句提供了增強的語法,在這里,對于前者來說,我們可以將判斷和賦值兩個步驟合二為一:

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));
}

而對于后者來說,主要打破了傳統 switch 陳述句的常量模式:

public static double ComputeArea_Version3(object shape)
{
    switch (shape)
    {
        case Square s when s.Side == 0:
        case Circle c when c.Radius == 0:
            return 0;

        case Square s:
            return s.Side * s.Side;
        case Circle c:
            return c.Radius * c.Radius * Math.PI;
        default:
            throw new ArgumentException(
                message: "shape is not a recognized shape",
                paramName: nameof(shape));
    }
}

引發運算式

這個主要是針對 throw 關鍵字的增強,當我看到微軟的檔案的時候,我突然意識到,這個語法其實我用了很久啦!

//場景A:條件運算子
string arg = args.Length >= 1 ? args[0] :
    throw new ArgumentException("You must supply an argument");
//場景B:Null合并運算子
public string Name
{
    get => name;
    set => name = value ??
        throw new ArgumentNullException(
          paramName: nameof(value), 
          message: "Name cannot be null");
}
//場景C:Lambda運算式
DateTime ToDateTime(IFormatProvider provider) =>
    throw new InvalidCastException("Conversion to a DateTime is not supported.");

以上,就是 C# 7.0 中我個人比較喜歡的語法特性,需要了解所有 C# 7.0 語法特性的小伙伴們,則可以參考這里:C# 7.0 - C# 7.3 中的新增功能,

C# 8.0

在 C# 8.0 中,我個人比較喜歡的特性主要有以下幾個:默認介面方法異步流索引和范圍

默認介面方法

關于這個,我覺得有點多此一舉,如果一定要有一個默認行為,那你用繼承來實作不就好啦,介面本來就是用來實作的啊摔!

public class ChineseSayHello : ISayHello
{
    public string Who { get; set; }
}

public interface ISayHello
{
    private const string DefaultPersopn = "Anumouse";
    string Who { get; set; }
    void SayHello()
    {
        Who = DefaultPersopn;
         Console.WriteLine($"Hello, {Who}");
    }
 }

在上面這個例子里,ChineseSayHello沒有實作SayHello()方法不影響編譯,因為ISayHello有默認實作,可正因為如此,SayHello()方法屬于ISayHello,不屬于ChineseSayHello

//正確,可以編譯
var sayHello = new ChineseSayHello() as ISayHello;
sayHello.SayHello();
//錯誤,無法編譯
 var sayHello = new ChineseSayHello();
sayHello.SayHello();

異步流

該特性可以看作是IEnumerable<T>的一個延伸,即IAsyncEnumerable<T>,主要有下面三個屬性:

  • 它是用 async 修飾符宣告的,
  • 它將回傳 IAsyncEnumerable,
  • 該方法包含用于在異步流中回傳連續元素的 yield return 陳述句,

下面是一個來自微軟官方的基本示例:

//生成異步流
public static async System.Collections.Generic.IAsyncEnumerable<int> GenerateSequence()
{
    for (int i = 0; i < 20; i++)
    {
        await Task.Delay(100);
        yield return i;
    }
}
//列舉異步流
await foreach (var number in GenerateSequence())
{
    Console.WriteLine(number);
}

和異步流相關的一個概念是:異步可釋放,即 System.IAsyncDisposable,這個可以參考:實作 DisposeAsync 方法,

索引和范圍

關于這個,我們換一種說法,可能大家就能接受啦!是什么呢?答案是:切片,切片語法博主經常在 Python 中使用,想不到有生之年居然可以在 C# 里用到這個語法,不過,這個語法糖怎么看都不甜啊,因為沒那味兒!

var words = new string[]
{
                // index from start index from end
    "The", // 0 ^9
    "quick", // 1 ^8
    "brown", // 2 ^7
    "fox", // 3 ^6
    "jumped", // 4 ^5
    "over", // 5 ^4
    "the", // 6 ^3
    "lazy", // 7 ^2
    "dog" // 8 ^1
};  
//取最后一個元素
Console.WriteLine($"The last word is {words[^1]}");
//獲取第一個元素到第三個元素
var quickBrownFox = words[1..4];
//獲取倒數第一個元素到倒數第二個元素
var lazyDog = words[^2..^0];
//獲取全部元素
var all = words[..];
//獲取開始到第三個元素
var firstPhrase = words[..4];
//獲取結束到倒數第二個元素
var lastPhrase = words[6..];

看起來這些東西在 Python 里都有啊,到底是哪里除了問題呢?我覺得更多的是符號上的不同吧, ^ 這個符號除了表示指數的意思以外,還有按位進行異或運算的意思,所以,這個語法糖加進來以后就會顯得相當混亂,而 .. 這個符號顯然沒有 : 寫起來方便啊,所以,雖然 C# 從 C# 8.0 開始有了切片語法,可這不是我想要的切片語法啊!

以上,就是 C# 8.0 中我個人比較喜歡的語法特性,需要了解所有 C# 8.0 語法特性的小伙伴們,則可以參考這里:C# 8.0 中的新增功能,

C# 9.0

在 C# 9.0 中,我個人比較喜歡的特性主要有以下幾個:Record頂級陳述句模式匹配增強

Record

record 是 C# 9.0 中提供的一個新的關鍵字,地位上等同于 classstruct,中文翻譯為:記錄型別,這是一種參考型別,它提供合成方法來提供值語意,從而實作相等性, 默認情況下,記錄是不可變的,簡而言之,record 是不可變的參考型別,你可能會說,我們為什么要搞這么一個型別出來呢?難道 class 不香嗎?

我覺得如果要回答這個問題,可以借鑒 DDD 中的物體值物件這兩個概念,物體 通常都有一個唯一的標識并且在整個生命周期中具有連續性,這一類角色通過 class 來實作一直都作業得很好,例如,每一個 User 都會有一個唯一的UserId ,我們使用 UserId 來判斷其相等性,而 值物件 則是指那些沒有唯一的標識、不可變的、通過屬性來判斷相等性,例如,我們有一個地址 Address,它由省、市、區、縣和詳細地址組成,那么,問題來了,如果兩個 Address 的省、市、區、縣和詳細地址都相同,這兩個 Address 是不是同一個地址呢?常識告訴我們:不會,因為它們是不同的實體,

這就是 record 出現的原因,對于上面的這個問題,我們可以來解決:

record Address
{
    public string Province { get; set; }
    public string City { get; set; }
    public string District { get; set; }
    public string County { get; set; }
}

var addr1 = new Address() { Province = "陜西省", City = "西安市", District = "雁塔區" };
var addr2 = new Address() { Province = "陜西省", City = "西安市", District = "雁塔區" };
Console.WriteLine($"addr1 == addr2:{addr1 == addr2}");

想想以前我們是怎么做的呢?是不是要寫類似下面這樣的代碼:

if (addr1.Province == addr2.Province && addr1.City == addr2.City) {

    //屬性太多啦,我就不一個一個地比較啦,懂得都懂
}

所以,這就是 record 存在的意義,除此之外呢,這個關鍵字更多的是語法層面上的,實際上從編譯出來的 IL 來看,它本質上依然是一個類,并且它是不可變的,定義記錄型別時,編譯器會合成其他幾種方法:

  • 基于值的相等性比較方法
  • 替代 GetHashCode()
  • 復制和克隆成員
  • PrintMembers 和 ToString()

那么,你可能還會有疑問,假如我定義了兩個不同的記錄型別,它們都擁有相同的屬性成員,如果按值相等來判斷的話,豈不是這兩個不同的記錄型別變成相同的了?這么重要的問題,微軟怎么可能沒有想到呢?編譯器會合成一個 EqualityContract 屬性,該屬性回傳與記錄型別匹配的 Type 物件,在這里,微軟再一次發揮了元組的威力,對于上面定義的地址,我們可以繼續使用解構語法:

(province, city, district, county) = addr1;

當然,我相信哪怕到2090年,這個世界上依然會有“杠精”:你說這玩意兒不能變?我就想變怎么辦?答案是使用with語法:

public record Person
{
    public string LastName { get; }
    public string FirstName { get; }

    public Person(string first, string last) => (FirstName, LastName) = (first, last);
}

var person = new Person("Bill", "Wagner");
Person brother = person with { FirstName = "Paul" }; // 修改FirstName的副本
Person clone = person with { }; // 空集副本

好了,關于記錄型別就先為大家介紹到這里,更詳細的說明可以參考這里:使用記錄型別,

頂級陳述句

頂級陳述句,這個又是一個聽起來非常模糊的概念對不對? 大家可以看一下這篇文章:26 種不同的編程語言的 “Hello World” 程式,怎么樣,在眾多解釋型的語言中,C#、Java 甚至 C++ 的 “Hello World” 是不是都看起來有一點臃腫?

好了,現在可以夢想成真啦!

using System;

Console.WriteLine("Hello World!");

如果覺得這樣還顯得臃腫,可以省略 using 部分:

System.Console.WriteLine("Hello World!");

當然啦,一個專案里顯然只能有一個檔案可以使用頂級陳述句,你可以理解為這些代碼運行在一個看不見的Main()方法中,而Main()方法顯然只能有一個,相比下來,Python 就自由多啦,不過if __name__ == '__main__'的老梗就不再這里展開啦!

模式匹配增強

感覺微軟在模式匹配的道路上越走越遠啊,說好的語法糖呢?這簡直是毒藥,7.0 里面眼花繚亂的switch都還沒學會呢!

public static bool IsLetter(this char c) =>
    c is >= 'a' and <= 'z' or >= 'A' and <= 'Z';

public static bool IsLetterOrSeparator(this char c) =>
    c is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z') or '.' or ',';

if (e is not null)
{
    // ...
}

以上,就是 C# 9.0 中我個人比較喜歡的語法特性,需要了解所有 C# 9.0 語法特性的小伙伴們,則可以參考這里:C# 9.0 中的新增功能,

參考鏈接

  • C# 發展歷史
  • C# 7.0 - C# 7.3 中的新增功能
  • C# 8.0 中的新增功能
  • C# 9.0 中的新增功能
  • C# 版本與 .NET 版本對應關系以及各版本的特性
  • C# 語言歷史版本特性(C# 1.0到C# 8.0匯總)
雪輕鴻 CSDN認證博客專家 .NET Python 偽·全堆疊攻城獅
謝謝你,在這世界的角落,找到我,一個即將進入而立之年的中年大叔,常年以 飛鴻踏雪 的花名混跡江湖,在現實生活中,我是一名 偽·全堆疊攻城獅,因為我覺得,什么都略懂一點,生活會更多彩一些,目前,主要關注.NET、.NET Core、Python、資料分析、微服務、Web 等技術方向,日常行為:讀書、寫作、電影、烹飪、洞簫等,喜歡看日劇/紀錄片/科普、刷B站、刷LeetCode等,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/257392.html

標籤:AI

上一篇:娜璋初識(一)你的酒窩沒有酒,我卻醉得像條狗,看程式員如何表白

下一篇:記錄一次線上 Oracle 資料庫 ORA-00060: deadlock detected 故障案例

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more