c#变量和修饰符

news2024/9/22 15:41:57

目录

1. 变量的作用域有哪些?

2. 成员变量和静态变量的区别?

3. 利用递归,写个文件目录遍历,打印出文件名、扩展名、文件大小

​4. 简述访问修饰符有几种,各有什么不同?

5. 重点比较public、protected、private的区别


1. 变量的作用域有哪些?

1. 局部变量

方法体内变量、if判断变量、for循环中变量

​void xx()

{

    int a = 10;  //局部变量,方法体内,作用域

    a = 20;

}


for(int i=0; i<10; i++)

{

    i++;  //局部变量,for循环体内有效

}

2. 块变量

{

    int x = 0;  //块的变量,作用域,块内有效

    x = 10;

}

3. 方法参数

只在方法体内生效

4. 成员变量

它在整个对象的所有的方法中都可以调用

5. 静态变量

静态变量的作用域是类的级别。这意味着静态变量可以在类的任何成员(包括静态和非静态成员)内部被访问和修改,但只能通过类名(对于静态成员)或类的实例(对于非静态成员,尽管这不是推荐的做法,因为它可能导致混淆)来访问。

然而,从“可见性”的角度来看,静态变量的作用域受到其访问修饰符(如publicprivateprotectedinternalprotected internal)的限制。这些修饰符决定了哪些代码可以访问静态变量。

2. 成员变量和静态变量的区别?

成员变量属于对象级别,每个对象创建时进行初始化,每个对象实例自己来独立维护这个成员变了。

静态变量属于类级别,当类加载时它就会被创建,比对象更早(创建一个工具类,工具类的方法都习惯使用静态)独一份。

相比静态变量的性能是高于成本变量。如果复用我们习惯使用静态的,如果各自独立使用,也不需要立即使用,用的时候在创建,我们习惯使用实例变量。

3. 利用递归,写个文件目录遍历,打印出文件名、扩展名、文件大小

下面是一个使用递归方法遍历目录并打印文件名、扩展名和文件大小的代码:

using System;  
using System.IO; 

namespace DJConsoleProject
{
    class Program
    {
        static void Main(string[] args)
        { 
            string directoryPath = @"C:\Users\Acer\source\repos\DJConsoleProject";

            // 调用递归函数开始遍历  
            TraverseDirectory(directoryPath);

            Console.ReadKey();
        }

        // 递归遍历目录  
        static void TraverseDirectory(string path)
        {
            try
            {
                // 获取指定目录下的所有文件和子目录  
                string[] files = Directory.GetFiles(path);
                string[] dirs = Directory.GetDirectories(path);

                // 遍历文件  
                foreach (var file in files)
                {
                    FileInfo fileInfo = new FileInfo(file);
                    Console.WriteLine($"文件名: {fileInfo.Name}, 扩展名: {fileInfo.Extension}, 文件大小: {fileInfo.Length} 字节");
                }

                // 遍历子目录  
                foreach (var dir in dirs)
                {
                    Console.WriteLine($"进入目录: {dir}");
                    TraverseDirectory(dir); // 递归调用  
                    Console.WriteLine($"离开目录: {dir}");
                }
            }
            catch (UnauthorizedAccessException)
            {
                Console.WriteLine($"无法访问目录 {path},权限不足。");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"遍历目录时发生错误: {ex.Message}");
            }
        }
    }
}

结果如图:


4. 简述访问修饰符有几种,各有什么不同?

C#的修饰符有public、protected、private、internal、internal protected共5种。

1. public 

public修饰符允许访问该成员不受任何限制。即,任何代码都可以访问该成员,无论它位于哪个类、命名空间或程序集中。

2. private

private只能在类的内部进行访问,面向对象封装的实践,不对外暴露实现细节。

3. protected

protected本类和子类可以使用,其他类都不行,包括孙子类,面向对象继承有关

4. internal

internal 程序集(多个项目之间共享)中共享,限制成员只能在其声明的程序集内部被访问。如果两个类位于同一个程序集中,那么它们可以互相访问对方的internal成员。

5.  internal protected

internal protected是internal和protected的组合,意味着成员可以在其所在的程序集内部以及派生自该类的任何子类中被访问。

5. 重点比较public、protected、private的区别

1. public

可访问性:public成员可以在任何地方被访问,不受任何限制。这包括类的内部、同一个命名空间的其他类、不同命名空间的其他类、甚至是在不同的程序集中。

使用创场景:通常用于定义类的公共接口,即那些被设计为被类的外部用户使用的成员。例如,一个类的公共方法或属性,用于执行某些操作或提供类的状态信息。

2. protected

可访问性:protected成员只能在其所在的类以及派生自该类的子类中被访问。这意味着不能从类的外部直接访问这些成员,但可以通过继承该类并在子类中访问这些成员。

使用场景:protected成员常用于基类中的方法或属性,这些成员在基类中需要被隐藏,但同时又希望子类能够访问和重写它们。例如,在面向对象编程中,可能会在基类中定义一些虚拟方法(virtual methods),然后在子类中重写这些方法。

3. private

可访问性:private成员只能在其所属的类内部被访问。这意味着你不能从类的外部(包括派生类)访问这些成员。

使用场景:private成员通常用于类的内部实现细节,这些实现细节不需要被类的外部用户知道或访问。例如,可能会在类中使用私有字段来存储数据,并通过公共属性来提供对这些数据的访问,从而封装数据并控制对数据的访问。

总的来说:

可访问范围:从最广到最窄依次是public(任何地方)、protected(类内部及派生类)、private(仅类内部)。

使用目的:public用于定义类的公共接口;protected 用于基类中的成员,这些成员需要被隐藏但允许子类访问;private用于类的内部实现细节,这些细节不应被类的外部直接访问。

对于public和protected的具体比较,我们可以通过实际情况来比较:

  1. BaseClass 基类:两个属性,两个方法,分别使用这两个修饰符
  2. DerivedClass 派生类(子类)
  3. Program

BaseClass.cs 基类

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

namespace DJConsoleApp527
{
    internal class BaseClass
    {
        public int pc;
        protected int pd;

        public void pcm()
        {
            Console.WriteLine("public method");
        }

        protected void pdm()
        {
            Console.WriteLine("protected method");
        }
    }
}

DerivedClass.cs 派生类

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

namespace DJConsoleApp527

{
    internal class DerivedClass : BaseClass
    {
        public void accessMember()

        {
            pc = 10;    //直接访问父类的public属性
            pd = 20;    //直接访问父类的protected属性

            pcm();      //直接访问父类的public方法
            pdm();      //直接访问父类的protected方法

        }
    }
}

调用 Program.cs

using DJConsoleApp527;

DerivedClass dc = new DerivedClass();
dc.accessMember();  //外部类通过派生类去访问基类

dc.pc = 10;     //public属性在哪都可以
//dc.pd = 20;     //报错:外部类属性不能直接访问,只能子类去访问

dc.pcm();       //public方法在哪都可以
//dc.pdm();       //报错:外部类方法不能直接访问,只能子类去访问

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

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

相关文章

如何从 Windows 11/10/8.1/8/7 恢复已删除的视频

意外删除了视频或格式化了 SD 卡/硬盘&#xff1f;没有备份已删除的视频&#xff1f;别担心&#xff0c;我们有解决方案来恢复 Windows 11、10 中已删除的视频并处理这种糟糕的情况。 但在了解如何恢复已删除的视频和视频恢复应用程序之前&#xff0c;请知道 Windows 会为您提…

九科bit-Worker RPA 内容学习

简介&#xff1a; 什么是RPA&#xff1f; RPA&#xff08;Robotic Process Automation&#xff0c;机器人流程自动化&#xff09;本质上是一种“AI数字员工”&#xff0c;针对企业中存在的大批量、重复性、机械化人工操作&#xff0c;通过模拟人的工作流程使之实现自动化。 b…

Vulnhub靶场DC-6练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集1. wordpress扫描2. wordlists字典爆破 0x03 漏洞查找与利用1. 漏洞查找2. CVE-2018-15877漏洞利用3. 反弹shell5. nmap提权 0x04 总结 0x00 准备 下载链接&#xff1a;https://download.vulnhub.com/dc/DC-6.zip 介绍&#…

Echarts桑基图

关于Echarts的使用方法参考&#xff1a;vue2中echarts的使用_vue2中使用echarts-CSDN博客 实现效果&#xff1a; 代码&#xff1a; var sysT {"用采": #2D9BFF,"营销系统": #39BFFF,"ERP": #76C2FF,"财务管控": #5F57FC,"PMS&…

用起来超爽的4个宝藏软件工具

记得带 “记得带”是一款专为繁忙的都市人设计的生活服务软件&#xff0c;旨在帮助用户轻松管理日常生活中的各种事务。该应用程序集成了多种实用功能&#xff0c;包括购物清单、待办事项、日程安排和健康追踪等。它还具有智能提醒功能&#xff0c;可以根据用户的日常习惯和偏好…

python特征相关性可视化分析 - sns.pairplot

seaborn 是一个基于 matplotlib 的 Python 数据可视化库&#xff0c;提供了更高层次的接口来绘制有吸引力的统计图形。pairplot 是 seaborn 中的一个函数&#xff0c;用于绘制数据集中多个变量之间的成对关系图。 基本用法 pairplot 函数可以快速地对数据集中的所有数值变量进…

49.实现调试器HOOK机制

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 上一个内容&#xff1a;47.HOOK引擎优化支持CALL与JMP位置做HOOK 以 47.HOOK引擎优化支持CALL与JMP位置做HOOK 它的代码为基础进行修改 效果图&#xff1a;游…

DBA 数据库管理

数据库&#xff1a;存储数据的仓库 数据库服务软件&#xff1a; 关系型数据库&#xff1a; 存在硬盘 &#xff0c;制作表格的 数据库的参数 [rootmysql50 ~]# cat /etc/my.cnf.d/mysql-server.cnf 主配置文件 [mysqld] datadir/var/lib/mysql 存放数据库目录…

【大模型实操 | LoRA、QLoRA微调大模型实战技巧分享,含常见QA解答!】

文末有福利&#xff01; 引言 今天给大家分享的这篇文章是关于LoRA微调大模型实操技巧&#xff0c;讨论了从实验中得出的主要经验和教训&#xff1b;此外&#xff0c;本文将解答一些与LoRA技术相关的常见问题。如果你对于微调定制化的大语言模型感兴趣&#xff0c;希望这些见…

HTML(28)——空间转换

空间&#xff1a;是从坐标轴角度定义的XYZ三条坐标轴构成了一个立体空间 Z轴位置与视线方向相同 空间转换 平移 属性&#xff1a; transform: translate3d(x,y,z);transform: translateX();transform: translateY();transform: translateZ(); 取值&#xff1a;像素单位数值…

Why Can’t Robots Click The “I’m Not a Robot” Box On Websites?

Clicking a tiny box tells Google all they need to know about your humanity 你好,我是 Jiabcdefh。 if you’ve browsed the internet for any amount of time, you will likely come across a reCAPTCHA box. These boxes appear when you first enter certain websites…

LabVIEW开发高灵敏静电计

开发了一套基于LabVIEW平台的高灵敏静电计控制软件&#xff0c;用于提升闪烁薄膜探测器在中子和伽马射线探测中的灵敏度标定精度。传统的标定方法存在数据准确性不高和操作复杂性高的问题&#xff0c;因此开发这款软件解决这些挑战&#xff0c;通过自动化控制和高效的数据处理&…

删除重复的图片

一、解决&#xff1a;删除重复的图片 最近在用某网盘下载文件时&#xff0c;发现下载的图片文件有重复的&#xff0c;一个图片重复3次下载。严重占用硬盘&#xff0c;下载速度还不快。 原本有1T多的硬盘容量现在还剩300G,只下载了96%&#xff0c;据观察1%的进度大约需要100G的…

Typora篇-忍痛开启

语雀专业会员即将到期, 我看着99元的学费款, 我决定重新用回Typora。 虽然里面有一些文件但是我还是舍不得ಥ_ಥ 99元巨款。 下面开启我的Typora整活历程&#xff0c; 大家有什么好用的插件快捷方式一起来分享啊。

设计模式之职责链模式(Chain of Responsibility Pattern)

1.概念 职责链模式&#xff08;Chain of Responsibility Pattern&#xff09;&#xff1a;避免将请求发送者与接收者耦合在一起&#xff0c;让多个对象都有机会接收请求&#xff0c;将这些对象连接成一条链&#xff0c;并且沿着这条链传递请求&#xff0c;直到有对象处理它为止…

阶段三:项目开发---大数据开发运行环境搭建:任务4:安装配置Spark集群

任务描述 知识点&#xff1a;安装配置Spark 重 点&#xff1a; 安装配置Spark 难 点&#xff1a;无 内 容&#xff1a; Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop …

身边的故事(十五):阿文的故事:再消失

物镜人非&#xff0c;沧海桑田。像我们这些普通的凡人&#xff0c;哪有什么试错的机会&#xff0c;每走一步都是如履薄冰&#xff0c;小心谨慎&#xff0c;错一步可能就会万劫不复。唉&#xff0c;如果...唉...哪有什么如果... 阿文的房子很快装修完成&#xff0c;入新房那天就…

Linux中的粘滞位及mysql日期函数

只要用户具有目录的写权限, 用户就可以删除目录中的文件, 而不论这个用户是否有这个文件的写 权限. 为了解决这个不科学的问题, Linux引入了粘滞位的概念. 粘滞位 当一个目录被设置为"粘滞位"(用chmod t),则该目录下的文件只能由 一、超级管理员删除 二、该目录…

【MYSQL】如何解决 bin log 与 redo log 的一致性问题

该问题问的其实就是redo log 的两阶段提交 为什么说redo log 具有崩溃恢复的能力 MySQL Server 层拥有的 bin log 只能用于归档&#xff0c;不足以实现崩溃恢复&#xff08;crash-safe&#xff09;&#xff0c;需要借助 InnoDB 引擎的 redo log 才能拥有崩溃恢复的能力。所谓崩…

【操作系统】进程管理——进程的同步与互斥(个人笔记)

学习日期&#xff1a;2024.7.8 内容摘要&#xff1a;进程同步/互斥的概念和意义&#xff0c;基于软/硬件的实现方法 进程同步与互斥的概念和意义 为什么要有进程同步机制&#xff1f; 回顾&#xff1a;在《进程管理》第一章中&#xff0c;我们学习了进程具有异步性的特征&am…