学习c#的第九天

news2024/11/23 12:31:31

目录

C# 可空类型(Nullable)

C# 可空类型(Nullable)

Null 合并运算符( ?? )

C# 数组(Array)

一维数组

声明及初始化赋值数组

多维数组

声明和初始化多维数组

访问和操作多维数组

实例

交错数组

声明和初始化交错数组

访问和操作交错数组

实例

交错数组与二维数组的区别

传递数组给函数

实例

参数数组

params 关键字

实例

Array 类

Array 类的属性

Array 类的方法

实例


C# 可空类型(Nullable)

C# 可空类型(Nullable)

可空类型允许我们在值类型中包含 null 值,这在处理数据库查询结果或需要表示缺失值的情况时非常有用。

声明一个可空类型的语法如下:

< data_type>? <variable_name> = null;

其中 <data_type> 是基础的值类型,例如 int、bool 等,? 符号表示这是一个可空类型,<variable_name> 是变量名,= 后面的 null 表示初始时该可空类型变量的值为 null。

对于 Nullable<T> 类型,编译器会执行一些特殊的处理,使得我们可以将 null 赋值给值类型,而不会出现编译错误。同时,Nullable<T> 类型也提供了一些属性和方法来方便地处理可空类型的值,比如 HasValue 来判断是否有值,Value 来获取值,GetValueOrDefault() 来获取值或默认值等。

使用可空类型可以很好地应对实际应用中遇到的可能存在缺失值的情况,同时也可以简化对数据库等数据源的处理。

 下面的实例演示了可空数据类型的用法:

using System;

public class CalculatorApplication
{
    class NullablesAtShow
    {
        static void Main(string[] args)
        {
            int? num1 = null;
            int? num2 = 45;
            double? num3 = new double?();
            double? num4 = 3.14157;

            bool? boolval = new bool?();

            // 显示值

            Console.WriteLine("显示可空类型的值: {0}, {1}, {2}, {3}",
                 num1, num2, num3, num4);
            Console.WriteLine("一个可空的布尔值: {0}", boolval);
            Console.ReadLine();

        }
    }
}

当上面的代码被编译和执行时,它会产生下列结果:

显示可空类型的值: , 45, , 3.14157
一个可空的布尔值:

Null 合并运算符( ?? )

空合并运算符 ?? 是 C# 中的一个方便的操作符,用于简化处理可能为 null 的情况。它提供了一种简洁的方式来检查并提供默认值,以避免空引用异常。

表达式 a ?? b 表示,如果 a 不为 null,则结果为 a 的值;如果 a 为 null,则结果为 b 的值。

以下是空合并运算符的一些特点和用法:

  • 当 a 不为 null 时,表达式的值为 a 的值。
  • 当 a 为 null 时,表达式的值为 b 的值。
  • a 和 b 的类型必须相同或兼容,否则会出现编译错误。
  • 空合并运算符可以在任何具有可空类型或引用类型的情况下使用。

下面是一个简单的示例,演示了空合并运算符的使用:

using System;

public class CalculatorApplication
{
    class NullablesAtShow
    {
        static void Main(string[] args)
        {
            int? x = null;
            int y = x ?? 5;  // 如果 x 不为 null,则 y 的值为 x 的值,否则为 5

            string name = null;
            string result = name ?? "Guest";  // 如果 name 不为 null,则 result 为 name 的值,否则为 "Guest"
            
            Console.WriteLine("y 的值: {0}", y);
            Console.WriteLine("result 的值: {0}", result);
            

        }
    }
}

当上面的代码被编译和执行时,它会产生下列结果:

y 的值: 5
result 的值: Guest

C# 数组(Array)

数组是一个存储相同类型元素的固定大小的顺序集合。数组是用来存储数据的集合,通常认为数组是一个同一类型变量的集合。

声明数组变量并不是声明 number0、number1、...、number99 一个个单独的变量,而是声明一个就像 numbers 这样的变量,然后使用 numbers[0]、numbers[1]、...、numbers[99] 来表示一个个单独的变量。数组中某个指定的元素是通过索引来访问的。

所有的数组都是由连续的内存位置组成的。最低的地址对应第一个元素,最高的地址对应最后一个元素。

C# 中的数组

一维数组

声明及初始化赋值数组

在 C# 中,声明数组需要指定数组的类型和名称,并可以选择指定数组的长度或初始化元素。

以下是几种常见的声明及初始化赋值数组的方式:

1、声明并初始化一个固定长度的数组:

int[] numbers = new int[5]; // 创建一个包含 5 个整数的数组
string[] names = new string[3]; // 创建一个包含 3 个字符串的数组

2、声明并初始化一个具有初始值的数组:

int[] numbers = new int[] { 1, 2, 3, 4, 5 }; // 创建一个包含 1、2、3、4 和 5 的整数数组
string[] names = new string[] { "Alice", "Bob", "Charlie" }; // 创建一个包含三个字符串的数组

3、使用简化的语法进行声明和初始化(仅适用于局部变量):

int[] numbers = { 1, 2, 3, 4, 5 }; // 类型推断,创建一个包含 1、2、3、4 和 5 的整数数组
string[] names = { "Alice", "Bob", "Charlie" }; // 类型推断,创建一个包含三个字符串的数组

在上述示例中,int[] 表示整数数组的类型,string[] 表示字符串数组的类型。使用 new 关键字创建一个新的数组实例,并指定数组的长度或初始化元素。

需要注意的是,数组的索引从 0 开始。可以通过索引来访问和修改数组中的元素,例如 numbers[0] 访问第一个元素,numbers[3] = 10 将第四个元素的值设置为 10。 

下面是一个实例:

using System;

class Program
{
    static void Main()
    {
        // 声明并初始化一个整数数组
        int[] numbers = new int[5] { 1, 2, 3, 4, 5 };

        // 声明并初始化一个字符串数组
        string[] names = new string[] { "Alice", "Bob", "Charlie" };

        // 使用简化的语法进行声明和初始化
        int[] otherNumbers = { 6, 7, 8, 9, 10 };
        string[] otherNames = { "Dave", "Eve", "Frank" };

        // 访问和修改数组中的元素
        Console.WriteLine("numbers[0]: " + numbers[0]); // 输出:1
        Console.WriteLine("names[1]: " + names[1]); // 输出:Bob

        numbers[3] = 12; // 修改数组中的元素
        Console.WriteLine("numbers[3] 修改后: " + numbers[3]); // 输出:12

        // 遍历数组并输出所有元素
        Console.WriteLine("数字数组中的所有元素:");
        foreach (int number in numbers)
        {
            Console.WriteLine(number);
        }

        Console.ReadLine();
    }
}

在上述示例中,我们创建了一个 Program 类,并在 Main 方法中进行了数组的声明、初始化和操作。首先,我们声明并初始化了两个数组 numbers 和 names,然后使用简化的语法声明并初始化了 otherNumbers 和 otherNames 数组。

接下来,我们展示了如何访问和修改数组中的元素。使用索引可以获取特定位置的元素的值,也可以修改元素的值。

最后,我们使用 foreach 循环(也可以使用 for 循环来访问每个数组元素)遍历数组并逐个输出所有元素。

多维数组

多维数组是数组的一种特殊形式,它允许在一个数组中存储多个维度的数据。在 C# 中,我们可以创建二维甚至更高维度的数组来表示表格、矩阵、立方体等数据结构。

声明和初始化多维数组

在 C# 中,可以使用以下语法来声明和初始化二维数组:

// 声明并初始化一个二维整数数组
int [,] matrix = new int [3,4] {
 {0, 1, 2, 3} ,   /*  初始化索引号为 0 的行 */
 {4, 5, 6, 7} ,   /*  初始化索引号为 1 的行 */
 {8, 9, 10, 11}   /*  初始化索引号为 2 的行 */
};

上述代码中,我们声明了一个名为 matrix 的二维整数数组,它包含 3 行和 4 列。

访问和操作多维数组

可以使用索引来访问多维数组中的元素。对于二维数组,我们使用两个索引来表示行和列:

// 访问和修改二维数组中的元素
matrix[0, 0] = 1; // 设置第一行第一列的元素值为 1
int value = matrix[1, 2]; // 获取第二行第三列的元素值

实例

using System;

class Program
{
    static void Main()
    {
        // 声明并初始化一个二维整数数组
        int[,] matrix = new int[3, 4];

        // 给数组赋值
        matrix[0, 0] = 1;
        matrix[0, 1] = 2;
        matrix[0, 2] = 3;
        matrix[0, 3] = 4;
        matrix[1, 0] = 5;
        matrix[1, 1] = 6;
        matrix[1, 2] = 7;
        matrix[1, 3] = 8;
        matrix[2, 0] = 9;
        matrix[2, 1] = 10;
        matrix[2, 2] = 11;
        matrix[2, 3] = 12;

        // 访问和输出二维数组中的元素
        Console.WriteLine("matrix[1, 2]: " + matrix[1, 2]); // 输出:7

        // 遍历二维数组并输出所有元素
        Console.WriteLine("矩阵阵列中的所有元素:");
        for (int i = 0; i < matrix.GetLength(0); i++)
        {
            for (int j = 0; j < matrix.GetLength(1); j++)
            {
                Console.Write(matrix[i, j] + " ");
            }
            Console.WriteLine();
        }

        Console.ReadLine();
    }
}

当上面的代码被编译和执行时,它会产生下列结果:

matrix[1, 2]: 7
矩阵阵列中的所有元素:
1 2 3 4
5 6 7 8
9 10 11 12

交错数组

交错数组(jagged array)是 C# 中的一种特殊数组形式,它允许在一个数组中存储其他数组作为其元素。与普通的多维数组不同,交错数组的各个维度的长度可以不同,因此它可以用来表示不规则的数据结构。

声明和初始化交错数组

在 C# 中,可以使用以下语法来声明和初始化一个交错数组:

// 声明并初始化一个交错数组
int[][] jaggedArray = new int[3][];
jaggedArray[0] = new int[] { 1, 2, 3 };
jaggedArray[1] = new int[] { 4, 5 };
jaggedArray[2] = new int[] { 6, 7, 8, 9 };

在上述示例中,我们声明并初始化了一个名为 jaggedArray 的交错数组。它包含了三个子数组,每个子数组的长度可以不同。

访问和操作交错数组

可以使用索引来访问交错数组中的元素,例如:

// 访问并输出交错数组中的元素
Console.WriteLine(jaggedArray[1][0]); // 输出:4

实例

using System;

class Program
{
    static void Main()
    {
        // 声明并初始化一个交错数组
        int[][] jaggedArray = new int[3][];
        jaggedArray[0] = new int[] { 1, 2, 3 };
        jaggedArray[1] = new int[] { 4, 5 };
        jaggedArray[2] = new int[] { 6, 7, 8, 9 };

        // 访问并输出交错数组中的元素
        Console.WriteLine("jaggedArray[1][0]: " + jaggedArray[1][0]); // 输出:4

        // 遍历交错数组并输出所有元素
        Console.WriteLine("交错数组中的所有元素:");
        for (int i = 0; i < jaggedArray.Length; i++)
        {
            for (int j = 0; j < jaggedArray[i].Length; j++)
            {
                Console.Write(jaggedArray[i][j] + " ");
            }
            Console.WriteLine();
        }

        Console.ReadLine();
    }
}

在上述示例中,我们声明并初始化了一个名为 jaggedArray 的交错数组。然后,我们访问了交错数组中的特定元素,并使用嵌套的循环遍历了整个交错数组,并逐个输出了所有元素。

交错数组与二维数组的区别

  1. 维度不同:交错数组是由多个一维数组组成的数组,每个子数组的长度可以不同。而二维数组是一个由固定长度的一维数组组成的矩阵,每个一维数组具有相同的长度。

  2. 内存布局不同:交错数组的各个子数组在内存中是连续存储的,但各个子数组之间可能不连续。而二维数组是在内存中按矩阵布局连续存储的。

  3. 初始化方式不同:交错数组可以通过逐个初始化子数组来构建,每个子数组的长度可以根据需要动态设置。而二维数组需要在声明时指定每个维度的长度,并且无法在后续修改。

  4. 访问方式不同:由于内存布局不同,访问交错数组和二维数组的元素的方式也有所不同。对于交错数组,我们首先访问主数组的元素,然后再通过索引访问子数组的元素。而对于二维数组,我们可以直接通过两个索引访问元素,从而获得更直观的访问方式。

传递数组给函数

实例

下面的实例演示了如何传递数组给函数:

using System;

class Program
{
    static void Main()
    {
        int[] arr = { 1, 2, 3, 4, 5 };

        // 调用函数并传递数组作为参数
        ProcessArray(arr);

        Console.ReadLine();
    }

    // 接收数组作为参数的函数
    static void ProcessArray(int[] array)
    {
        Console.WriteLine("接收的数组:");
        foreach (int element in array)
        {
            Console.Write(element + " ");
        }
    }
}

在这个示例中,我们定义了一个名为 ProcessArray 的函数,它接收一个 int 类型的数组作为参数。在 Main 函数中,我们创建了一个数组 arr,然后将它作为参数传递给 ProcessArray 函数。

当运行这段代码时,ProcessArray 函数将会接收到数组,并输出数组中的所有元素。

参数数组

params 关键字

在 C# 中,可以使用参数数组(params array)来接受可变数量的参数。参数数组允许在函数调用时传递一个可变长度的参数列表,而不需要显式地创建一个数组。

params 的使用格式为:

public 返回类型 方法名称( params 类型名称[] 数组名称 )

实例

using System;

class Program
{
    static void Main()
    {
        // 调用函数并传递多个参数
        PrintNumbers(1, 2, 3, 4, 5);

        Console.ReadLine();
    }

    // 使用参数数组的函数
    static void PrintNumbers(params int[] numbers)
    {
        Console.WriteLine("接收的数组:");
        foreach (int number in numbers)
        {
            Console.WriteLine(number);
        }
    }
}

在上述示例中,我们定义了一个名为 PrintNumbers 的函数,它使用参数数组来接收可变数量的整数参数。在 Main 函数中,我们调用了 PrintNumbers 函数,并传递了多个整数参数。

当你运行这段代码时,PrintNumbers 函数会接收到传递的参数,并逐个输出它们。

需要注意的是,

  • 带 params 关键字的参数类型必须是一维数组,不能用于多维数组。
  • params 关键字不允许与 ref 或 out 关键字同时使用。因为 ref 和 out 都是用来传递参数的引用,而 params 是用来接收可变数量的参数的,它们的语义不兼容。
  • 带 params 关键字的参数必须是方法声明中的最后一个参数,并且在同一个方法声明中只允许出现一个 params 关键字。
  • 不能仅使用 params 来区分重载的方法。编译器无法准确地确定调用哪个重载方法,因为对于参数数量不确定的情况,重载方法的选择将变得模糊。
  • 没有 params 关键字的方法在重载决策中具有更高的优先级。

Array 类

Array 类的属性

下表列出了 Array 类中一些最常用的属性:

序号属性 & 描述
1IsFixedSize
获取一个值,该值指示数组是否带有固定大小。
2IsReadOnly
获取一个值,该值指示数组是否只读。
3Length
获取一个 32 位整数,该值表示所有维度的数组中的元素总数。
4LongLength
获取一个 64 位整数,该值表示所有维度的数组中的元素总数。
5Rank
获取数组的秩(维度)。

如需了解 Array 类的完整的属性列表,请参阅微软的 C# 文档。

Array 类的方法

下表列出了 Array 类中一些最常用的方法:

序号方法 & 描述
1Clear
根据元素的类型,设置数组中某个范围的元素为零、为 false 或者为 null。
2Copy(Array, Array, Int32)
从数组的第一个元素开始复制某个范围的元素到另一个数组的第一个元素位置。长度由一个 32 位整数指定。
3CopyTo(Array, Int32)
从当前的一维数组中复制所有的元素到一个指定的一维数组的指定索引位置。索引由一个 32 位整数指定。
4GetLength
获取一个 32 位整数,该值表示指定维度的数组中的元素总数。
5GetLongLength
获取一个 64 位整数,该值表示指定维度的数组中的元素总数。
6GetLowerBound
获取数组中指定维度的下界。
7GetType
获取当前实例的类型。从对象(Object)继承。
8GetUpperBound
获取数组中指定维度的上界。
9GetValue(Int32)
获取一维数组中指定位置的值。索引由一个 32 位整数指定。
10IndexOf(Array, Object)
搜索指定的对象,返回整个一维数组中第一次出现的索引。
11Reverse(Array)
逆转整个一维数组中元素的顺序。
12SetValue(Object, Int32)
给一维数组中指定位置的元素设置值。索引由一个 32 位整数指定。
13Sort(Array)
使用数组的每个元素的 IComparable 实现来排序整个一维数组中的元素。
14ToString
返回一个表示当前对象的字符串。从对象(Object)继承。

如需了解 Array 类的完整的方法列表,请参阅微软的 C# 文档。

实例

using System;
namespace ArrayApplication
{
    class MyArray
    {

        static void Main()
        {
            int[] list = { 34, 72, 13, 44, 25, 30, 10 };

            Console.Write("原始数组: ");
            foreach (int i in list)
            {
                Console.Write(i + " ");
            }
            Console.WriteLine();

            // 逆转数组
            Array.Reverse(list);
            Console.Write("逆转数组: ");
            foreach (int i in list)
            {
                Console.Write(i + " ");
            }
            Console.WriteLine();

            // 排序数组
            Array.Sort(list);
            Console.Write("排序数组: ");
            foreach (int i in list)
            {
                Console.Write(i + " ");
            }
            Console.WriteLine();

            Console.ReadKey();
        }
    }
}

当上面的代码被编译和执行时,它会产生下列结果:

原始数组: 34 72 13 44 25 30 10
逆转数组: 10 30 25 44 13 72 34
排序数组: 10 13 25 30 34 44 72

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

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

相关文章

【备忘】在Nginx服务器安装SSL证书

您可以在Nginx或Tengine服务器上安装SSL证书&#xff0c;实现通过HTTPS安全访问Web服务器。本文介绍如何为Nginx或Tengine服务器安装SSL证书。 重要 本文以CentOS 8.0 64位操作系统、Nginx 1.14.2为例介绍。不同版本的操作系统或Web服务器&#xff0c;部署操作可能有所差异&a…

<MySQL> MySQL中查询(retrieve)数据的基础操作

目录 一、查询&#xff08;retrieve&#xff09; 1.1 查询数据的方式概述 二、全列查询 2.1 语法 2.2 操作演示 2.3 全列查询需要慎重使用 三、指定列查询 3.1 语法 3.2 操作演示 四、表达式查询 4.1 语法 4.2 操作演示 4.3 null 参与表达式计算 4.3 表达式查询存…

2023前端流行的新技术

作为2023年之前的技术水平有限&#xff0c;以下是一些目前为止较为热门的前端开发技术和趋势&#xff0c;这些技术可能在2023年之前进一步发展和普及。 前端程序员可以考虑学习和掌握以下技术&#xff1a; 1.Vue 3和React Hooks&#xff1a;Vue.js和React是目前最受欢迎的JavaS…

Layer 2 真的为以太坊扩容了吗?

构建一个安全、对用户友好的去中心化网络的愿景&#xff0c;依赖于关键基础设施的发展。这个愿景由一个共享的经济框架支持&#xff0c;得到了亿万人的拥护。Layer 2 的扩展解决方案在构建这一基础和增强以太坊的能力方面起着至关重要的作用。这些项目相互协作&#xff0c;形成…

抢疯了!OpenAI开出1000万美元天价年薪 北大AI博士未毕业拿百万offer

图片 抢疯了&#xff0c;抢疯了&#xff01;OpenAI和谷歌的抢人大战&#xff0c;已经进入白热化。 OpenAI给谷歌员工抛出了终极诱惑——500万到1000万美元的年薪&#xff01;以及来自微软的用不完的算力&#xff01; 图片 这不&#xff0c;谷歌复仇神器Gemini模型的关键研究…

【python】Django——django简介、django安装、创建项目、快速上手

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ Django基础——django安装、创建django项目、django快速上手 django简介django安装1. conda创建环境pydjango2. pip安装django3. django目录 创建项目1. 打开终端(cmd)2. 进入某个目录3.创建项目命令4.django项目…

网络问题导致pycharm无法提交代码到代码仓库

现象 ssh: Could not resolve hostname github.com: Name or service not known fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 原因及解决办法 可能不是自己权限有问题&#xff0c;而是…

网站定制开发的流程|软件app小程序开发定制

网站定制开发的流程|软件app小程序开发定制 网站定制开发是一个为个体或企业创建定制化网站的过程。它涉及到规划、设计、开发和测试等一系列步骤&#xff0c;以满足客户的需求和目标。下面是网站定制开发的基本流程。 1. 需求分析&#xff1a;首先&#xff0c;与客户沟通并了解…

Qt高级--(1)自定义导航栏

好久没有水博客&#xff0c;参考别人的写一个自定义的导航栏吧。用处挺多的&#xff0c;可以用来切换到不同的信息显示界面。 功能点 1.默认情况下&#xff0c;文字居中显示&#xff0c;不显示图标&#xff0c;不显示三角。 2.可设置文字左侧、顶部、右侧、底部边距&#xff…

k8s系列文章二:集群配置

一、关闭交换分区 # 临时关闭分区 swapoff -a # 永久\关闭自动挂载swap分区 sudo sed -i / swap / s/^\(.*\)$/#\1/g /etc/fstab 二、修改cgroup管理器 ubuntu 系统&#xff0c;debian 系统&#xff0c;centos7 系统&#xff0c;都是使用 systemd 初始化系统的。systemd 这边…

行业追踪,2023-11-13

自动复盘 2023-11-13 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

CSRF 漏洞详解

CSRF 漏洞详解 漏洞描述 CSRF&#xff08;Cross-Site Request Forgery&#xff09;漏洞是一种Web应用程序安全漏洞&#xff0c;它允许攻击者利用受害者的已认证会话来执行未经授权的恶意操作。攻击者可以诱使受害者在受害者已经登录的情况下&#xff0c;通过社交工程或其他方…

前端中 JS 发起的请求可以暂停吗?

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;web前端面试题库 这个问题非常有意思&#xff0c;我一看到就想了很多可以回复的答案&#xff0c;但是评论区太窄&#xff0c;就直接开…

MTK手机平台充电原理

EPT GPIO初始化文件 bsp_gpio_ept_config.c 1 知识点总结 1.1 Official 参考充电电路 Figure 1-1 参考电路 VCHG&#xff1a;USB正极 VCDT&#xff1a;VCHG Charger Detect充电电压检测脚 ISENSE&#xff1a;充电电流检测电阻的正极 BATSNS&#xff1a;充电电流检测电阻的负极 …

VMware配置NAT模式网络

一、选择VMWare的NAT模式。 1&#xff09;导航栏“编辑”->“虚拟网络编辑器” ->NAT模式->NAT设置 记住NAT设置中的子网IP、子网掩码、网关IP三项&#xff0c;接下来配置文件主要是这三项。 嗯&#xff0c;这里记得按确定&#xff0c;我之前没有按确定写好配置后还…

c++-哈希

文章目录 前言一、unordered系列关联式容器1、unordered_map2、性能测试 二、哈希1、哈希概念2、哈希冲突3、哈希冲突解决3.1 闭散列3.2 开散列3.3 字符串Hash函数3.4 哈希桶实现的哈希表的效率 三、哈希表封装unordered_map和unordered_set容器1、unordered_map和unordered_se…

【PG】PostgreSQL 预写日志(WAL)、checkpoint、LSN

目录 预写式日志&#xff08;WAL&#xff09; WAL概念 WAL的作用 WAL日志存放路径 WAL日志文件数量 WAL日志文件存储形式 WAL日志文件命名 WAL内容 检查点&#xff08;checkpoint&#xff09; 1 检查点概念 2 检查点作用 触发检查点 触发检查点之后数据库操作 设置合…

擎创动态 | 再获上海区政府肯定,擎创科技被评为年度优秀高新技术企业

11月6日&#xff0c;上海市静安区副区长张慧和市北高新集团总裁陈军一行来到擎创科技调研指导&#xff0c;由擎创科技高管张健和陈莹陪同交流。 陈莹女士首先向副区长一行详细介绍了擎创科技的发展现状、落地实践效益以及未来的规划布局。在公司的成长过程中&#xff0c;得到静…

安卓现代化开发系列——从状态保存到SavedState

由于安卓已经诞生快二十载&#xff0c;其最初的开发思想与现代的开发思想已经大相径庭&#xff0c;特别是Jetpack库诞生之后&#xff0c;项目中存在着新老思想混杂的情况&#xff0c;让许多的新手老手都措手不及&#xff0c;项目大步向屎山迈进。为了解决这个问题&#xff0c;开…

linux时间同步

搭建集群时&#xff0c;都会先设置时间同步&#xff0c;否则会出现多种问题。 方式一&#xff1a; 1.安装ntp软件 yum install -y ntp 2.更新时区 删除原有时区&#xff1a;sudo rm -f /etc/localtime 加载新时区&#xff1a;sudo ln -s /usr/share/zoneinfo/Asia/Shangh…