使用BigQuery分析GitHub上的C#代码

一年多以前,Google 在GitHub中提供了BigQuery用于查询的GitHub上的开源代码(open source code on GitHub available for querying),如果这还不够,您可以免费每月运行1TB的查询!

所以在这篇文章中,我将要收集GitHub上的所有我们可以访问的C#源代码。非常简单,只包含C#,而且数据集已经收集完成(在BigQuery中,是按字节读取收费的),称为fh-bigquery:github_extracts.contents_net_cs 并具有

  • 5,885,933 不重复的“.cs”文件

  • 792,166,632 行代码 (LOC)

  • 37.17 GB (37,174,783,891 bytes) 数据

这是一套非常全面的C#源代码!


这篇文章的剩余部分将 尝试 回答以下问题:

  1. Tab或空格?

  2. regions:“应该被禁止”或“在某些情况下使用”?

  3. “K&R” or “Allman”, C#开发者喜欢把它们的大括号放在哪里?(译者注:关于‘K&R’ 与 ‘Allman’,请参考维基百科)

然后转到一些没有争议的C#主题:

  1. 哪些using 声明使用最广泛?

  2. 哪些NuGet软件包常常被包含在.NET项目中

  3. C#文件一般有多少行代码(LOC)?

  4. 使用最广泛的“Exception”是哪一个?

  5. 使用“async/await”?

  6. C#开发人员是否喜欢使用“var”关键字?

在我们最终看到Repository:

  1. 包含C#代码最流行的Repository是哪一些

  2. 在一个Repository中一般有多少个文件?

  3. 最受欢迎的C# Class 名称中哪些?

  4. “Foo.cs”,“Program.cs”或其它,最常见的文件是哪些?

如果您想为自己尝试查询(或发现我的错误),那么所有这些查询可以在github上面找到,链接地址。很有可能我的正则表达式遗漏了一些边缘案例,毕竟正则表达式:现在有两个问题:


Tab或空格?

在整个数据集中有5,885,933个文件,但是我们只包括一个从Tab或空格开始的10行以上的文件

Tabs Tab(百分比) 空格 空格(百分比) 总计
799,055 17.15% 3,859,528 82.85% 4,658,583

显然,C#开发人员(在GitHub上)喜欢空格超过Tab !(我认为一些这可以通过Visual Studio中的事实来解释:默认情况下使用“空格”)。

如果您想了解C#与其它编程语言的比较,请查看40万个GitHub资源库,10亿个文件,14太字节的代码:空格或制表符?。

regions:“应该被禁止”或“在某些情况下使用”?

事实证明,有一个令人印象深刻的712,498 C#文件(总共580万),至少包含一个#region语句(查询方法),只有超过12%。(我希望很多这些文件已被工具自动生成!)

“K&R” or “Allman” ,C#开发者喜欢把它们的大括号放在哪里?

C#开发人员绝大多数喜欢将打开大括号{放在当单独的行上(查询方法)

单独行 同一行 同一个(初始化实例) 总计 (包括大括号) 总计(全部代码)
81,306,320 (67%) 40,044,603 (33%) 3,631,947 (2.99%) 121,350,923 (15.32%) 792,166,632

(“同一行初始化实例”包括代码new { Name = "", .. }new [] { 1, 2, 3.. }


哪些 using 声明 使用最广泛?

这是一个更实质的统计,C#代码中,using 声明 最广泛的语句是哪一些?

显示前10名结果(全部统计结果在这里查看):

using 声明 总计
using System.Collections.Generic; 1,780,646
using System; 1,477,019
using System.Linq; 1,319,830
using System.Text; 902,165
using System.Threading.Tasks; 628,195
using System.Runtime.InteropServices; 431,867
using System.IO; 407,848
using System.Runtime.CompilerServices; 338,686
using System.Collections; 289,867
using System.Reflection; 218,369

但是,当您在Visual Studio中添加新文件时,默认情况下包含前5个,许多人不会删除它们。默认情况下,“AssemblyInfo.cs”中包含的“System.Runtime.InteropServices”和“System.Runtime.CompilerServices”也是一样。

所以如果我们考虑到这一点,调整一下统计规则,前10名的结果是:

using 声明 总计
using System.IO; 407,848
using System.Collections; 289,867
using System.Reflection; 218,369
using System.Diagnostics; 201,341
using System.Threading; 179,168
using System.ComponentModel; 160,681
using System.Web; 160,323
using System.Windows.Forms; 137,003
using System.Globalization; 132,113
using System.Drawing; 127,033

最后,using 声明不在SystemMicrosoftWindows命名空间的前10名统计结果 :

using 声明 总计
using NUnit.Framework; 119,463
using UnityEngine; 117,673
using Xunit; 99,099
using Newtonsoft.Json; 81,675
using Newtonsoft.Json.Linq; 29,416
using Moq; 23,546
using UnityEngine.UI; 20,355
using UnityEditor; 19,937
using Amazon.Runtime; 18,941
using log4net; 17,297

哪些NuGet软件包常常被包含在.NET项目中

还有一个单独的数据集包含GitHub上的所有‘packages.config’文件,它被称为contents_net_packages_config,有104,808个条目。通过查询,我们可以看到Json.Net是完胜的赢家!

package 总计
Newtonsoft.Json 45,055
Microsoft.Web.Infrastructure 16,022
Microsoft.AspNet.Razor 15,109
Microsoft.AspNet.WebPages 14,495
Microsoft.AspNet.Mvc 14,236
EntityFramework 14,191
Microsoft.AspNet.WebApi.Client 13,480
Microsoft.AspNet.WebApi.Core 12,210
Microsoft.Net.Http 11,625
jQuery 10,646
Microsoft.Bcl.Build 10,641
Microsoft.Bcl 10,349
NUnit 10,341
Owin 9,681
Microsoft.Owin 9,202
Microsoft.AspNet.WebApi.WebHost 9,007
WebGrease 8,743
Microsoft.AspNet.Web.Optimization 8,721
Microsoft.AspNet.WebApi 8,179

一般C#文件中有多少行代码(LOC)?

C#开发人员是否容易创建巨大的文件,可以为1000的行?

注意Y轴是“代码行”,原始数据。

您是否想知道十大最大的C#文件是哪些呢!

文件 行数
MarMot/Input/test.marmot.cs 92663
src/CodenameGenerator/WordRepos/LastNamesRepository.cs 88810
cs_inputtest/cs_02_7000.cs 63004
cs_inputtest/cs_02_6000.cs 54004
src/ML NET20/Utility/UserName.cs 52014
MWBS/Dictionary/DefaultWordDictionary.cs 48912
Sources/Accord.Math/Matrix/Matrix.Comparisons1.Generated.cs 48407
UrduProofReader/UrduLibs/Utils.cs 48255
cs_inputtest/cs_02_5000.cs 45004
css/style.cs 44366

使用最广泛的“Exception”是哪一个?

这里有一些有趣的结果(查询方式),谁知道这么多ApplicationExceptions被抛出来,NotSupportedException这么高令人有点担心!

Exception 总计
throw new ArgumentNullException 699,526
throw new ArgumentException 361,616
throw new NotImplementedException 340,361
throw new InvalidOperationException 260,792
throw new ArgumentOutOfRangeException 160,640
throw new NotSupportedException 110,019
throw new HttpResponseException 74,498
throw new ValidationException 35,615
throw new ObjectDisposedException 31,129
throw new ApplicationException 30,849
throw new UnauthorizedException 21,133
throw new FormatException 19,510
throw new SerializationException 17,884
throw new IOException 15,779
throw new IndexOutOfRangeException 14,778
throw new NullReferenceException 12,372
throw new InvalidDataException 12,260
throw new ApiException 11,660
throw new InvalidCastException 10,510

使用“async/await”?

在C#语言中使用asyncawait关键字编写异步代码更容易:

    public async Task<int> GetDotNetCountAsync()    {        // Suspends GetDotNetCountAsync() to allow the caller (the web server)// to accept another request, rather than blocking on this one.var html = await _httpClient.DownloadStringAsync("http://dotnetfoundation.org");    return Regex.Matches(html, ".NET").Count;}

但它使用了多少?使用下面的查询:

SELECT Count(*) countFROM[fh-bigquery:github_extracts.contents_net_cs]    WHEREREGEXP_MATCH(content, r'\sasync\s|\sawait\s')

我发现有218,643个文件(总共5,885,933个)至少使用一个asyncawait关键字。

C#开发人员是否喜欢使用“var”关键字?

asyncawait关键字使用的更少,只有130,590个文件至少有一个var关键字被使用。


在一个Repository中一般有多少个文件?

90%的Repository(具有任何C#文件)具有95个或更少的文件。95%具有170个文件或更少,99%具有535个或更少的文件。

(Y轴(C##文件)是个数)

根据C#文件数量排名前10的最大Repository如下所示:

Repository C#文件数
https://github.com/xen2/mcs 23389
https://github.com/mater06/LEGOChimaOnlineReloaded 14241
https://github.com/Microsoft/referencesource 13051
https://github.com/dotnet/corefx 10652
https://github.com/apo-j/Projects_Working 10185
https://github.com/Microsoft/CodeContracts 9338
https://github.com/drazenzadravec/nequeo 8060
https://github.com/ClearCanvas/ClearCanvas 7946
https://github.com/mwilliamson-firefly/aws-sdk-net 7860
https://github.com/151706061/MacroMedicalSystem 7765

最受欢迎的Repository是哪一些(其中有C#代码)?

这次我们将要统计包含至少50个C#文件(查询方式)的最受欢迎的Repository(基于GitHub'stars' ):

Repository stars 文件数
https://github.com/grpc/grpc 11075 237
https://github.com/dotnet/coreclr 8576 6503
https://github.com/dotnet/roslyn 8422 6351
https://github.com/facebook/yoga 8046 73
https://github.com/bazelbuild/bazel 7123 132
https://github.com/dotnet/corefx 7115 10652
https://github.com/SeleniumHQ/selenium 7024 512
https://github.com/Microsoft/WinObjC 6184 81
https://github.com/qianlifeng/Wox 5674 207
https://github.com/Wox-launcher/Wox 5674 142
https://github.com/ShareX/ShareX 5336 766
https://github.com/Microsoft/Windows-universal-samples 5130 1501
https://github.com/NancyFx/Nancy 3701 957
https://github.com/chocolatey/choco 3432 248
https://github.com/JamesNK/Newtonsoft.Json 3340 650

有趣的是,第一名是Google Repository!(其中的C#文件是使用.NET中的GRPC库的示例代码)

最受欢迎的C# Class 名称中哪些?

假设我使用正则表达式,最流行的C# class名称如下:

Class 名称 总计
class C 182480
class Program 163462
class Test 50593
class Settings 40841
class Resources 39345
class A 34687
class App 28462
class B 24246
class Startup 18238
class Foo 15198

Yay Foo,偷偷进入前10!

'Foo.cs','Program.cs'或其它,最常见的文件是哪些?

最后,我们来看看class使用的不同的名称,就像using声明作为Visual Studio默认模板一样:

文件 总计
AssemblyInfo.cs 386822
Program.cs 105280
Resources.Designer.cs 40881
Settings.Designer.cs 35392
App.xaml.cs 21928
Global.asax.cs 16133
Startup.cs 14564
HomeController.cs 13574
RouteConfig.cs 11278
MainWindow.xaml.cs 11169

原文:《Analysing C# code on GitHub with BigQuery》http://mattwarren.org/2017/10/12/Analysing-C-code-on-GitHub-with-BigQuery/
翻译:Sweet Tang
本文地址:http://www.cnblogs.com/tdfblog/p/Analysing-C-code-on-GitHub-with-BigQuery.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323211.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NOIP2018普及组复赛解析

T1:标题统计 题目大意 输入一个字符串&#xff0c;求字符串除了空格的字符个数 解题思路 这种考你会不会编程的题不会&#xff1f; code #include<cstdio> #include<string> #include<iostream> using namespace std; int ans; string c; int main() {get…

Shell变量的初始值赋值

转载自 Shell变量的初始值赋值 通常在shell中&#xff0c;在变量值为空的时候我们要为变量设置一个默认值&#xff0c;避免在脚本运行的过程中报错&#xff0c;这就是变量的初始值赋值。 通常比较简洁的有以下两种&#xff0c;都能对一个变量赋予一个初始值&#xff0c; ${va…

【博客】博客转移

最近一直在搞博客&#xff0c;随着博客基本转移到wordpress&#xff0c;总算是告一段落。 我通过各种博客搬家的方式都没能把博客转移到wordpress上&#xff0c;后来实在没办法&#xff0c;强行Gutenberg编辑器&#xff0c;一个一个复制粘贴到自己博客上面&#xff0c;总算是实…

AspectCore中的IoC容器和依赖注入

IOC模式和依赖注入是近年来非常流行的一种模式&#xff0c;相信大家都不陌生了&#xff0c;在Asp.Net Core中提供了依赖注入作为内置的基础设施&#xff0c;如果仍不熟悉依赖注入的读者&#xff0c;可以看看由我们翻译的Asp.Net Core中文文档中依赖注入的相关章节: ASP.NET Cor…

[编程入门]阶乘求和:求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字(n不超过20)。

【题目描述】求Sn1!2!3!4!5!…n!之值&#xff0c;其中n是一个数字(n不超过20)。#include<iostream> using namespace std;void fun(int n) {long long sn0,s1;for(int i1;i<n;i){for(int j1;j<i;j){s*j;}sns;s1;}cout<<sn<<endl; }int main() {int n;c…

bzoj1791,P4381-[IOI2008]Island【基环树,树形dp,单调队列dp,树的直径】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP4381 题目大意 有n个岛&#xff0c;n条无向边(保证每个岛都有边连到)。走过的路和岛不可以重走&#xff0c;可以坐船。 坐船要求之前没有任何使用过的船加上道路可以到达那个点才可以坐船。 求最长可…

【总结】找到自适合的学习方法

通过高中与大学的比较 我发现自己大学学的东西要比高中多很多&#xff0c;也要更加的充实。 说白了&#xff0c;其实我认为就是自己擅长与不擅长的学习方式罢了。 1、我更喜欢那种自由轻松一点的学习环境&#xff0c;高中把我压得太紧了&#xff08;老师喜欢提问&#xff09…

HttpClient的性能隐患

最近在进行开发过程中&#xff0c;基于都是接口开发&#xff0c;A站接口访问B接口接口来请求数据&#xff0c;而在这个过程中我们使用的是HttpClient这个框架&#xff0c;当然也是微软自己的框架&#xff0c;性能当前没有问题&#xff0c;但如果你直接使用官方的写法&#xff0…

P5022-旅行【基环树,dfs】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP5022 题目大意 一棵树(可能是基环树)&#xff0c;从1出发&#xff0c;每到达一个新的点就记录下编号。求一种走法使得记录下来的编号字典序最小。 解题思路 我们先不考虑基环树。我们可以发现每次走…

【填坑】博客搬家造成的博客重复问题

原本我的博客数量是差不多八十几篇&#xff0c;昨天晚上一看&#xff0c;怎么变成一百三十多篇了。 惊讶之余有点不可思议&#xff0c;查了才发现原来有几十篇是重复的&#xff0c;后来删掉了一些&#xff0c;但还是有很多 有些也不是重复的&#xff0c;我从知乎发的东西也被搬…

[编程入门]猴子吃桃的问题

猴子吃桃问题。猴子第一天摘下若干个桃子&#xff0c;当即吃了一半&#xff0c;还不过瘾&#xff0c;又多吃了一个。 第二天早上又将剩下的桃子吃掉一半&#xff0c;又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。 到第N天早上想再吃时&#xff0c;见只剩下一个桃子了…

Javafx的WebEgine执行window对象设置属性后为undefined

一、场景复现 window10 jdk1.8u221 package main;import javafx.application.Application; import javafx.beans.value.ObservableValue; import javafx.concurrent.Worker; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.Sta…

P4168-[Violet]蒲公英【分块】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP4168 题目大意 询问区间众数 解题思路 将数字离散化&#xff0c;然后分块。对于数组vi,j,kv_{i,j,k}vi,j,k​&#xff0c;表示i∼ji\sim ji∼j个块&#xff0c;kkk的个数。对于询问(l,r)(l,r)(l,r)&…

使用acs-engine在Azure中国区部署kubernetes集群详解

1. acs-engine简介 ACS是微软在2015年12月推出的一项基于容器的云端PaaS服务。说简单点&#xff0c;acs-engine就是一个ARM模板生成器&#xff0c;用户只需要配置几个简单的参数来描述容器集群的规格&#xff0c;然后acs-engine将这个容器集群描述文件转化成一组ARM&#xff08…

C++描述杭电OJ 2011.多项式求和 ||

C描述杭电OJ 2011.多项式求和 || Problem Description 多项式的描述如下&#xff1a; 1 - 1/2 1/3 - 1/4 1/5 - 1/6 … 现在请你求出该多项式的前n项的和。 Input 输入数据由2行组成&#xff0c;首先是一个正整数m&#xff08;m<100&#xff09;&#xff0c;表示测试实…

【Java】continue和break区别

先总结下&#xff1a;break先跳出整个大的循环&#xff0c;而continue跳出的是相对小的循环 也就是说他们的区别核心在于循环的大小 就举个例子吧&#xff0c;用for循环从一数到十&#xff0c;到五用上break和continue的区别 用break&#xff1a; public class test_01 { pu…

JS中令人发指的valueOf方法介绍

转载自 JS中令人发指的valueOf方法介绍 彭老湿近期月报里提到了valueOf方法&#xff0c;兴致来了翻了下ECMA5里关于valueOf方法的介绍&#xff0c;如下&#xff1a; 15.2.4.4 Object.prototype.valueOf ( ) When the valueOf method is called, the following steps are take…

P3203-[HNOI2010]弹飞绵羊【分块】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP3203 题目大意 nnn个装置。到第iii个装置会被往前弹aia_iai​个。 两种操作 修改aia_iai​和询问从iii出发要多少次弹射可以弹出去。 解题思路 分块。对于每个点&#xff0c;维护要多少步弹出该块和弹…

Lyft的TypeScript实践

来自Lyft的前端工程师Mohsen Azimi介绍了Lyft向TypeScript转型的过程&#xff0c;说明JavaScript类型系统的重要性、为什么Lyft选择TypeScript以及他们的一些实践经验。以下内容翻译自作者的博客&#xff0c;查看原文TypeScript at Lyft。 在我刚刚成为JavaScript开发者的时候&…

【Python】Conda的安装

挖个坑&#xff0c;以后自己慢慢填&#xff1a;下载conda后无法使用 conda优势&#xff1a;conda将几乎所有的工具、第三方包都当做package对待&#xff0c;甚至包括python和conda自身&#xff01;因此&#xff0c;conda打破了包管理与环境管理的约束&#xff0c;能非常方便地…