基本的C#面試問題(15例)

来源:https://www.cnblogs.com/star8521/archive/2020/06/02/13029126.html
-Advertisement-
Play Games

1、給定一個int數組,編寫方法以統計所有偶數的值。 有很多方法可以做到這一點,但是最直接的兩種方法是: static long TotalAllEvenNumbers(int[] intArray) { return intArray.Where(i => i % 2 == 0).Sum(i => ...


1、給定一個int數組,編寫方法以統計所有偶數的值。

有很多方法可以做到這一點,但是最直接的兩種方法是:

static long TotalAllEvenNumbers(int[] intArray) {
return intArray.Where(i => i % 2 == 0).Sum(i => (long)i);
}

還有就是

static long TotalAllEvenNumbers(int[] intArray) {
return (from i in intArray where i % 2 == 0 select (long)i).Sum();
}

當然,你還需要註意以下關鍵:

你是否利用 C#語言特性 一行就解決問題。(即,不是使用包含迴圈,條件語句和累加器的更長篇幅的解決方案)

你是否考慮過溢出的可能性。例如,諸如

return intArray.Where(i => i % 2 == 0).Sum()(與函數的返回類型無關)

 

這可能一個很”明顯”的單行,但這樣溢出的可能性很高。雖然上面的答案中使用的轉換為long的方法並沒有消除這種可能性,但是它使得發生溢出異常的可能性非常小。但請註意,如果你寫答案的時候詢問數組的預期大小及其成員的大小,則顯然你在做這道題目的時候在考慮此溢出問題,這很棒。

2、下麵的代碼的輸出是什麼?解釋你的答案。

class Program {
static String location;
static DateTime time;

static void Main() {
Console.WriteLine(location == null ? "location is null" : location);
Console.WriteLine(time == null ? "time is null" : time.ToString());
}
}


輸出將是:

location is null
1/1/0001 12:00:00 AM
下麵的簡短程式的輸出是什麼?解釋你的答案。簡短程式的輸出是什麼?解釋你的答案。
儘管兩個變數都未初始化,但是String是引用類型 、DateTime 是值類型。作為值類型,單位化DateTime變數設置為預設值 公元1年晚上12點,而不是 null

3、下麵語句中 time 和null 的比較是有效還是無效的?

static DateTime time;
/* ... */
if (time == null)
{
/* do something */
}
有人可能會認為,由於變數永遠不可能為null (它被自動初始化為1月1日的值),所以編譯器在比較某個變數時就會報錯。具體來說,操作符將其操作數強制轉換為不同的允許類型,以便在兩邊都得到一個通用類型,然後可以對其進行比較。這就是為什麼像這樣的東西會給你期望的結果(而不是失敗或意外的行為,因為操作數是不同的類型):
double x = 5.0;
int y = 5;
Console.WriteLine(x == y); // outputs true
然而,這有時會導致意外的行為,例如DateTime變數和null的比較。在這種情況下,DateTime變數和null文字都可以轉換為可空的。因此,比較這兩個值是合法的,即使結果總是假的。

4、給定circle以下類的實例:

public sealed class Circle {
private double radius;

public double Calculate(Func<double, double> op) {
return op(radius);
}
}


簡編寫代碼以計算圓的周長,而無需修改Circle類本身。
首選的答案如下:

circle.Calculate(r => 2 * Math.PI * r);

由於我們不能訪問對象的私有半徑欄位,所以我們通過內聯傳遞計算函數,讓對象本身計算周長。

許多c#程式員迴避(或不理解)函數值參數。雖然在這種情況下,這個例子有點做作,但其目的是看看申請人是否瞭解如何制定一個調用來計算哪個與方法的定義相匹配。

另外,一個有效的(雖然不那麼優雅的)解決方案是從對象中檢索半徑值本身,然後執行計算結果:

var radius = circle.Calculate(r => r);
var circumference = 2 * Math.PI * radius;

無論哪種方式。我們在這裡主要尋找的是面試者是否熟悉並理解如何調用Calculate方法。

5、下麵程式的輸出是什麼?解釋你的答案。

class Program {
private static string result;

static void Main() {
SaySomething();
Console.WriteLine(result);
}

static async Task<string> SaySomething() {
await Task.Delay(5);
result = "Hello world!";
return “Something”;
}


下麵
此外,如果我們替換wait task,答案會改變嗎? 比如 thread . sleep (5) ? 為什麼?的簡短

程式的輸出是什麼?解釋你的答案。序的輸出是什麼?解釋你的答案。

回答:

問題第一部分(即帶有的代碼版本await Task.Delay(5);)的答案是該程式將僅輸出一個空行(而不是 “ Hello world!”)。這是因為調用result時仍將未初始化Console.WriteLine。

大多數程式和麵向對象的程式員都希望函數return在返回調用函數之前從頭到尾執行,或者從語句執行。C#async函數不是這種情況。它們只執行到第一個await語句,然後返回到調用方。由await(在此例中為Task.Delay)調用的函數是非同步執行的,並且該await語句之後的行直到Task.Delay完成(在5毫秒內)之前都不會發出信號。但是,在這段時間內,控制權已經返回給調用者,該調用者Console.WriteLine對尚未初始化的字元串執行該語句。

調用await Task.Delay(5) 可讓當前線程繼續其正在執行的操作,如果已完成(等待任何等待),則將其返回到線程池。這是非同步/等待機制的主要好處。它允許CLR使用線程池中的更少線程來服務更多請求。

非同步編程已經變得越來越普遍,因為執行許多活動的網路服務請求或資料庫請求的設備越來越普遍。C#具有一些出色的編程結構,可以極大地簡化非同步方法的編程任務,並且意識到它們的程式員將產生更好的程式。

關於問題的第二部分,如果將await Task.Delay(5);其替換為Thread.Sleep(5),則程式將輸出Hello world!。一種沒有至少一個語句的async方法,其操作就像同步方法一樣。也就是說,它將從頭到尾執行,或者直到遇到一條語句為止。調用只是阻塞了當前正在運行的線程,因此調用僅將方法的執行時間增加了5毫秒。awaitreturnThread.Sleep()Thread.Sleep(5)SaySomething()

6、下麵的程式輸出是什麼?解釋你的答案。

delegate void Printer();

static void Main()
{
List<Printer> printers = new List<Printer>();
int i=0;
for(; i < 10; i++)
{
printers.Add(delegate { Console.WriteLine(i); });
}

foreach (var printer in printers)
{
printer();
}
}


這個程式將把數字10輸出十次。

原因如下: 委托被添加到 for迴圈中l了,而 “引用” (或者“指針”)被存儲到i中,而不是值本身。因此,在我們退出迴圈之後,變數i被設置為10,所以到調用每個委托時,傳遞給它們的值都是10。

7、是否可以將混合數據類型(例如int,string,float,char)全部存儲在一個數組中?

是! 之所以可以這樣做,是因為數組的類型object不僅可以存儲任何數據類型,還可以存儲類的對象,如下所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication8
{
class Program
{
class Customer
{
public int ID { get; set; }
public string Name { get; set; }
public override string ToString()
{
return this.Name;
}
}
static void Main(string[] args)
{
object[] array = new object[3];
array[0] = 101;
array[1] = "C#";
Customer c = new Customer();
c.ID = 55;
c.Name = "Manish";
array[2] = c;
foreach (object obj in array)
{
Console.WriteLine(obj);
}
Console.ReadLine();
}
}
}

8、比較C#中的結構和類。他們有什麼共同點?它們有何不同?

C#中的類和結構確實有一些共同點,即:

他們都是

是複合數據類型

可以包含方法和事件

可以支持介面

但是有許多差異。比較一下:

類:

支持繼承

是引用(指針)類型

引用可以為空

每個新實例都有記憶體開銷

結構:

不支持繼承

是值類型

按值傳遞(如整數)

不能有空引用(除非使用了Nullable)

每個新實例沒有記憶體開銷(除非“裝箱”)

9、這裡有一個包含一個或多個$符號的字串,例如: "foo bar foo $ bar $ foo bar $ " 問題:如何$從給定的字元串中刪除第二和第三次出現的?

答案:

使用如下正則表達式:

string s = "like for example $ you don't have $ network $ access";
Regex rgx = new Regex("\\$\\s+");
s = Regex.Replace(s, @"(\$\s+.*?)\$\s+", "$1$$");
Console.WriteLine("string is: {0}",s);

說明:

($\s+.*?)-第1組,捕獲一個文字$,一個或多個空格字元,然後捕獲除換行符以外的任意數量的字元,並儘可能少地捕獲到下一個最接近的匹配項

$\s+—單個$符號和一個或多個空格字元

$1引用組1的值,它只是將其插入被替換的字元串中,$$代表替換模式中的$符號。

10、下麵的程式輸出是什麼?

public class TestStatic
{
public static int TestValue;

public TestStatic()
{
if (TestValue == 0)
{
TestValue = 5;
}
}
static TestStatic()
{
if (TestValue == 0)
{
TestValue = 10;
}
}

public void Print()
{
if (TestValue == 5)
{
TestValue = 6;
}
Console.WriteLine("TestValue : " + TestValue);

}
}

public void Main(string[] args)
{
TestStatic t = new TestStatic();
t.Print();
}
TestValue : 10


 

在創建該類的任何實例之前,將調用該類的靜態構造函數。此處調用的靜態構造函數TestValue首先將變數初始化。

11、有沒有一種方法可以修改ClassA、以便您可以在調用Main方法時使用參數調用構造函數,而無需創建任何其他新實例ClassA?

class ClassA
{
public ClassA() { }

public ClassA(int pValue) { }
}


啟動類

class Program
{
static void Main(string[] args)
{
ClassA refA = new ClassA();
}
}

回答:

所述this關鍵字被用於調用其他構造,初始化該類對象。下麵是實現:

class ClassA
{
public ClassA() : this(10)
{ }

public ClassA(int pValue)
{ }
}

12、以下代碼輸出什麼?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace main1
{
class Program
{
static void Main(string[] args)
{
try
{
Console.WriteLine("Hello");
}
catch (ArgumentNullException)
{
Console.WriteLine("A");
}
catch (Exception)
{
Console.WriteLine("B");
}
finally
{
Console.WriteLine("C");
}
Console.ReadKey();
}
}
}


答案:

Hello
C

13、描述依賴註入。

依賴註入是一種使緊密鏈接的類分離的方式,從而減少了類之間的直接依賴。有多種方法可以實現依賴項註入:

構造函數依賴

屬性依賴

方法依賴

14、編寫一個C#程式,該程式接受以千米為單位的距離,將其轉換為米,然後顯示結果。

using system;

class abc

{
public static Void Main()

{

int ndistance, nresult;

Console.WriteLine("Enter the distance in kilometers");

ndistance = convert.ToInt32(Console.ReadLine());

nresult = ndistance * 1000;

Console.WriteLine("Distance in meters: " + nresult);

Console.ReadLine();

}

}

15、描述裝箱和拆箱。並寫一個例子。

裝箱是將值類型隱式轉換為該類型object或該值類型實現的任何介面類型。將值類型裝箱會創建一個包含該值的對象實例,並將其存儲在堆中。

例:

int x = 101;
object o = x; // boxing value of x into object o

o = 999;
x = (int)o; // unboxing value of o into integer x

最後:
面試不僅要基礎扎實,更重要的是能解決棘手的技術問題,所以以上這些內容僅供參考。並非每個值得招聘的優秀候選人都能夠回答所有問題,也不能確定能夠全部回答,就能保證他是一個優秀候選人。歸根結底,招聘仍然是一門藝術,一門科學以及許多工作。

來源:https://www.iwmyx.cn/15gjbdcmswt.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • C#有兩種類型:值類型和引用類型。值類型的變數直接包含數據,引用類型的變數則包含對變數(對象)的引用。對於引用類型,兩個變數可以引用同一個對象,所以,對一個變數的操作可能會影響另一個變數引用的對象。而對於值類型,每個變數都有自己的數據副本,因此,對一個變數的操作不會影響到另一個變數(ref和out參 ...
  • 函數簽名 假設有一個函數 f,輸入一個 int 值,返回一個 string 值,在 C# 中,該函數可以表示為: Func<int, string> 我們可以使用箭頭(→)符號來表示: f : int → string 箭頭符號是函數式編程社區的標準函數符號,與語言無關。 當沒有輸入或沒有輸出(vo ...
  • Code Snippet功能:敲幾個關鍵字,按兩下Tab鍵,插入設好的代碼片段。我們可以在代碼片段管理里導入自己需要的代碼片段。 敲寫“review”,按兩下Tab鍵,自動出來編寫好的代碼片段。 在編輯->InteliSence->插入片段,可以選擇各種不同的片段插入。 ...
  • Named pipe (more flexible)Allows two-way communication between arbitrary processes on the same computer or different computers across a network.A pipe ...
  • BackWork代碼: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Utils { publ ...
  • 系列文章 基於 abp vNext 和 .NET Core 開發博客項目 - 使用 abp cli 搭建項目 基於 abp vNext 和 .NET Core 開發博客項目 - 給項目瘦身,讓它跑起來 基於 abp vNext 和 .NET Core 開發博客項目 - 完善與美化,Swagger登場 ...
  • 很多情況下,我們需要用到Tab 選項卡的情況 例如下麵 註冊審批頁面 這個場景是,註冊審批,包含兩部分,一個是對註冊組織機構的審批,一個是註冊用戶的審批那麼這個需要用個Tab選項卡來實現比較合適,而不是弄兩個功能菜單 那這個頁面怎麼實現呢。 關於Tab的使用,我們有兩種模式。 第一種模式:Tab只是 ...
  • serilog .net core 3.1 配置方式 安裝包dotnet add package Serilog dotnet add package Serilog.AspNetCore 早初始化模式 public class Program { public static IConfigurat ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...